gpt4 book ai didi

python - Pandas v0.13.0 : Setting DataFrame values of type datetime64[ns]

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:42 32 4
gpt4 key购买 nike

我最近将 Pandas 更新到 v0.13.0,它似乎引入了日期时间类型数据的问题。

让我们以这个例子为例,我们有一个包含一列 datetime64[ns] 和一列 int32 的数据框。

import pandas as pd
import numpy as np

t = pd.date_range('2000-01-01','2000-01-20')
v = np.arange(0,len(t))
df = pd.DataFrame({'date':t,'val':v})

首先,让我们将每一列设置为相同数据类型的标量值。

# SETTING SCALAR OF SAME TYPE
df.loc[:,'val'] = v[0] # Works fine
df.loc[:,'date'] = t[0] # Works fine

Pandas 正确广播了数据。两列都没有问题。

其次,让我们尝试用不同数据类型的标量替换:

# SETTING SCALAR, BUT OF DIFFERENT DTYPE
df.loc[:,'val'] = t[0] # Works fine
df.loc[:,'date'] = v[0] # Does not work?

虽然第一次操作成功,但第二次出现错误:“ValueError:新类型与数组不兼容。”

第三,让我们尝试用数据向量替换每一列(不更改数据类型):

df = pd.DataFrame({'date':t,'val':v})

# SETTING VECTOR
df.loc[:,'val'] = v * 2 # Works fine
df.loc[:,'date'] = t.shift(365) # Does not work?

同样,第一个操作有效。但是第二次操作失败,错误:“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”

有人知道这是怎么回事吗?这可能是两个不同的问题。感谢您的帮助!

编辑:感谢 Jeff 对上述问题提供了正确的答案。然而,他的回答确实提出了一个(希望是)最后一个问题:

如何分配给 DataFrame 的子集,其中该子集跨越多行和多列并且至少一列是 datetime64 类型?

例如:

t  = pd.date_range('2000-01-01','2000-01-20')        
v = np.arange(0,len(t))
df = pd.DataFrame({'date':t,'val':v,'val2':v})

# USING LABELS
df.loc[4:7,['val','val2']] = df.loc[4:7,['val','val2']] # Works fine
df.loc[4:7,['date','val']] = df.loc[4:7,['date','val']] # Does not work?

# USING ROW SLICE
df[4:7] = df[4:7] # Does not work?

# USING BOOLEAN ROW MASK
mask = np.array([True] * len(df))
mask[[1,4,8]] = False
df[mask] = df[mask] # Does not work?

虽然 Jeff 使用 df[col] = val 而不是 df.loc[:,col] = val 的解决方案正确地解决了我原来的问题(列分配),但它对基于行(或行 x 列)没有帮助-based)赋值。*

  • 除非你转置 df.T[[4,5,6]] = df.T[[4,5,6]],但这看起来像是作弊......

谢谢。

最佳答案

你操作的是直接列设置吗。

In [40]: df['date'] = v[0]

In [41]: df
Out[41]:
date val
0 0 0
1 0 1
2 0 2
3 0 3
4 0 4
5 0 5
6 0 6
7 0 7
8 0 8
9 0 9
10 0 10
11 0 11
12 0 12
13 0 13
14 0 14
15 0 15
16 0 16
17 0 17
18 0 18
19 0 19

[20 rows x 2 columns]

In [42]: df = pd.DataFrame({'date':t,'val':v})

In [43]: df['date'] = t.shift(365)

In [44]: df
Out[44]:
date val
0 2000-12-31 0
1 2001-01-01 1
2 2001-01-02 2
3 2001-01-03 3
4 2001-01-04 4
5 2001-01-05 5
6 2001-01-06 6
7 2001-01-07 7
8 2001-01-08 8
9 2001-01-09 9
10 2001-01-10 10
11 2001-01-11 11
12 2001-01-12 12
13 2001-01-13 13
14 2001-01-14 14
15 2001-01-15 15
16 2001-01-16 16
17 2001-01-17 17
18 2001-01-18 18
19 2001-01-19 19

[20 rows x 2 columns]

通过执行类似 df.loc[:,'date'] 的操作看起来很相似。但是您实际上要说的不是用右侧的内容替换此列,而是使用行掩码覆盖(在这种情况下它恰好为空)。 dtype 转换未在此处完成,因为您可能会执行非常昂贵的操作。

当你只是简单地设置一个新列时,更喜欢直接的 setitem df[col] = val

这不是错误,而是经过深思熟虑的选择;我想我会对此做一个文档说明,因为这是我见过的第二个问题 w.r.t.对此,我想这有点令人困惑。

关于python - Pandas v0.13.0 : Setting DataFrame values of type datetime64[ns],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415432/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com