Pandas 在新列计算中使用索引

Pandas use index in new column calculation

提问人:Olga 提问时间:9/9/2023 更新时间:9/9/2023 访问量:45

问:

我有一个数据帧,如下所示:

df = pd.DataFrame(data={'A', 'B', 'C'}, columns = ['Letter'])

索引自动设置为 [0,1,2]

然后,我想添加一个新列,该列将从数据帧的长度中提取索引数值:

df['Calc'] = len(df) - df.index

它给了我一个错误: ValueError:值 (0) 的长度与索引 (3) 的长度不匹配

但是,如果我在创建 DataFrame 时自己添加索引,如下所示:

df = pd.DataFrame(data={'A', 'B', 'C'}, columns = ['Letter'], index = [0,1,2])
df['Calc'] = len(df) - df.index

它运行良好,并添加了新列:

计算器
0 一个 3
1 B 2
2 C 1

我正在处理更大的数据集和更复杂的计算,但我无法理解这种行为背后的逻辑。在我的另一个例子中,pandas 会毫无错误地将新列添加到 DataFrame 中,但是一旦我reset_index(),它就不起作用。

你能解释一下这种行为吗?

Python Pandas 索引

评论

1赞 Barmar 9/9/2023
在第一种情况下是 ,它是动态的;在第二个版本中,它是固定的。如果你这样做,你可以看到区别df.indexRangeIndexIndexprint(df.index)
0赞 wjandrea 9/9/2023
撇开重点不谈,但你为什么要对数据使用集合?不对套装进行排序。你是想使用一个列表,只是放错了括号吗?(即['A', 'B', 'C'])
0赞 wjandrea 9/9/2023
如果你看一下的结果,你可以看到问题:。降序范围需要有一个负数,否则它是空的。len(df) - df.indexRangeIndex(start=3, stop=0, step=1)step

答:

1赞 Jesse Sealand 9/9/2023 #1

只需添加到索引中,这会将 RangeIndex 转换为值列表。.values

import pandas as pd
df = pd.DataFrame(data=['A', 'B', 'C'], columns=['Letter'])
df['Calc'] = len(df) - df.index.values
  Letter  Calc
0      A     3
1      B     2
2      C     1