Pandas 为什么数据帧和它的列之间存在这种不一致?
在调试代码中的一个严重错误时,我遇到了这样一个问题:数据帧的工作方式不一致(使用pandas=1.0.3): 然后我尝试在Pandas 为什么数据帧和它的列之间存在这种不一致?,pandas,dataframe,Pandas,Dataframe,在调试代码中的一个严重错误时,我遇到了这样一个问题:数据帧的工作方式不一致(使用pandas=1.0.3): 然后我尝试在y中添加一列(忘记了y是一个系列,而不是一个数据帧): 我现在意识到这给这个系列增加了一个奇怪的行y现在是: 0 11 1 11 2
y
中添加一列(忘记了y
是一个系列,而不是一个数据帧):
我现在意识到这给这个系列增加了一个奇怪的行<代码>y现在是:
0 11
1 11
2 11
3 11
d 0 0
1 10
2 20
3 30
Name: d, dtype...
Name: k, dtype: object
但奇怪的是现在:
>>> df.shape, df['k'].shape
((4, 4), (5,))
和df
和df['k']
看起来像:
d k c1 c2
0 0 11 22 33
1 10 11 22 33
2 20 11 22 33
3 30 11 22 33
及
这里有几件事在起作用:
- 熊猫系列可以存储任意类型的对象
向名为y['d']=\uu
的系列'd'
中添加一个新对象y
- 因此,
向名为y['d']=df['d']
的序列'd'
添加一个新对象,值为序列y
df['d']
y
。你可以核实一下
和(y['d']==y.iloc[-1])。all()==True
(y.iloc[-1]==df['d'])。all()==True
df
和df.k
之间的不一致性:请注意df.k
、df['k']
或df.loc[:,'k']
返回列k
的系列“视图”,因此,向系列添加条目将直接将其附加到此视图。但是,df.k
显示整个序列,而df
仅显示序列的最大长度df.shape[0]
。因此出现了不一致的行为
我同意这种行为容易出现错误,应该加以纠正。查看与复制是许多问题的常见原因。在这种情况下,
df.iloc[:,1]
的行为正确,应该使用它来代替。是的,我现在知道了。我感到惊讶的是,现在df
和df['k']
不同步;或者,更好的是,它被允许不同步。接得好。这是因为df['k',df.k,df.loc()
是视图,而不是副本。我同意这里的行为似乎有问题。df
的视图应限制为最大长度df.shape[0]
。您可能希望在github上提出此问题。@user21338如果您打开问题,请注意使用更直接的示例来说明原因。这将有助于人们更快地注意到并解决问题。也许我是这样做的,但我认为我的例子足够简单。请问,您将如何简化它?@user21338例如,y['new\u name']='new\u value'
。因此,代码是自我解释的,感兴趣的问题从y
中奇怪的输入值中分离出来。至少对我来说是这样,我知道更有经验的人会有更简单的方式来清楚地表达这个问题。
>>> df.shape, df['k'].shape
((4, 4), (5,))
d k c1 c2
0 0 11 22 33
1 10 11 22 33
2 20 11 22 33
3 30 11 22 33
0 11
1 11
2 11
3 11
d 0 0
1 10
2 20
3 30
Name: d, dtype...
Name: k, dtype: object