Pandas DataFrame的列(Series)与DataFrame的索引不同?

4

考虑这个小脚本:

import pandas as pd

df = pd.DataFrame({'a': [1,2,3]})
b = df.a
b.index = b.index + 1
df['b'] = b
print(df)
print(df.a - df.b)

输出结果为:

   a    b
0  1  NaN
1  2  1.0
2  3  2.0

0    NaN
1    0.0
2    0.0
3    NaN

当我期望 df.a - df.b

0    NaN
1    1.0
2    1.0

这怎么可能?这是Pandas的bug吗?


有趣的是,aa.indexaa.a.index是不同的。看起来pandas在替换引用的索引时感到困惑了(在bb.index = bb.index + 1中)。 - Yevhen Kuzmovych
没错。这是预期行为吗(我能找到记录这个的地方吗?)还是一个错误? - Opocio
为了扩展@YevhenKuzmovych的评论,aa.a.index在添加列'b'之前和之后是不同的。通过添加相邻列来修改列'a'似乎对我来说也是一种奇怪的行为,尽管我认为这也可能是pandas未被正确使用的情况。也许OP应该研究.diff().join(),以避免需要将新列分配为整个“Series”对象。 - Owen
3个回答

2
aa = pd.DataFrame({'a': [1,2,3]})
bb = aa.a
bb.index = bb.index + 1
aa['b'] = bb
aa.reset_index(drop=True)  # add this

您的索引不匹配。


那么,每个Dataframe列都记住了自己的索引,而不是假设Dataframe索引?这对我来说非常反直觉。 - Opocio

1
使用以下代码以获得您所期望的结果:
aa = pd.DataFrame({'a': [1,2,3]})
bb = aa.a.copy()
bb.index = bb.index + 1
aa['b'] = bb
print(aa)
print(aa.a - aa.b)

1
当您执行 aa.b - aa.a 时,您正在减去两个长度相同但索引不同的 pandas.Series
aa.a

1    1
2    2
3    3
Name: a, dtype: int64

而:

aa.b

0    NaN
1    1.0
2    2.0
Name: b, dtype: float64

当你这样做时:

print(aa.b - aa.a)

你正在打印这两个 pandas.Series 的合并结果(不考虑操作类型:加法或减法),这就是为什么索引 [0,1,2] 和 [1,2,3] 将合并为一个新的索引从 0 到 3:[0,1,2,3]。
例如,如果你将 bb.index 向右移动 2 个位置而不是 1:
bb.index = bb.index + 2

那时,您的新 pandas.Series 将会有5行,而不是4行。以此类推...
bb.index = bb.index + 2
aa['b'] = bb
print(aa.a - aa.b)

0    NaN
1    NaN
2    0.0
3    NaN
4    NaN
dtype: float64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接