Pandas 为什么数据帧和它的列之间存在这种不一致?

Pandas 为什么数据帧和它的列之间存在这种不一致?,pandas,dataframe,Pandas,Dataframe,在调试代码中的一个严重错误时,我遇到了这样一个问题:数据帧的工作方式不一致(使用pandas=1.0.3): 然后我尝试在y中添加一列(忘记了y是一个系列,而不是一个数据帧): 我现在意识到这给这个系列增加了一个奇怪的行y现在是: 0 11 1 11 2

在调试代码中的一个严重错误时,我遇到了这样一个问题:数据帧的工作方式不一致(使用pandas=1.0.3):

然后我尝试在
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