我想在Pandas DataFrame中从另一行中减去一行。我在一个数字列之前有多个描述符列,迫使我在两个描述符列上设置DataFrame的索引。
当我这样做时,我会在set_index()列列表中列出的第一个列名称上得到一个KeyError。在这种情况下,它是' COL_A':
df = pd.DataFrame({'COL_A': ['A', 'A'],
'COL_B': ['B', 'B'],
'COL_C': [4, 2]})
df.set_index(['COL_A', 'COL_B'], inplace=True)
df.iloc[1] = (df.iloc[1] / df.iloc[0])
df.reset_index(inplace=True)
KeyError: 'COL_A'
我没有再考虑这个问题,也无法弄清楚为什么KeyError会解决这个问题。
答案 0 :(得分:1)
考虑下面给出的示例数据框:
In [44]: result
Out[44]:
monthyear Facility Date Yield Planned
0 Dec 15 CCM2 2015-12-01 2550.000000 0.0
1 Feb 16 CCM2 2016-02-01 4250.000000 0.0
2 Jan 16 CCM1 2016-01-01 1540.000000 0.0
3 Jan 16 CCM2 2016-01-01 6800.000000 0.0
4 Nov 15 CCM1 2015-11-01 921.458157 880.0
5 Nov 15 CCM2 2015-11-01 1750.310038 3000.0
6 Sep 15 CCM2 2015-09-01 5191.197065 8000.0
现在,要从'Yield'中减去'Planned'列,请执行以下操作:
In [45]: result['Yield']-result['Planned']
Out[45]:
0 2550.000000
1 4250.000000
2 1540.000000
3 6800.000000
4 41.458157
5 -1249.689962
6 -2808.802935
如果要将差异存储在另一列中,则:
在[46]中:结果['差异'] =结果['收益'] - 结果['计划']
In [47]: result
Out[47]:
monthyear Facility Date Yield Planned Difference
0 Dec 15 CCM2 2015-12-01 2550.000000 0.0 2550.000000
1 Feb 16 CCM2 2016-02-01 4250.000000 0.0 4250.000000
2 Jan 16 CCM1 2016-01-01 1540.000000 0.0 1540.000000
3 Jan 16 CCM2 2016-01-01 6800.000000 0.0 6800.000000
4 Nov 15 CCM1 2015-11-01 921.458157 880.0 41.458157
5 Nov 15 CCM2 2015-11-01 1750.310038 3000.0 -1249.689962
6 Sep 15 CCM2 2015-09-01 5191.197065 8000.0 -2808.802935
答案 1 :(得分:0)
我不确定我是否理解正确:
df = pd.DataFrame({'COL_A': ['A', 'A'],
'COL_B': ['B', 'B'],
'COL_C': [4, 2]})
给出:
COL_A COL_B COL_C
0 A B 4
1 A B 2
然后
df.set_index(['COL_A', 'COL_B'], inplace=True)
df.iloc[1] = (df.iloc[1] / df.iloc[0])
的产率:
COL_A COL_B
A B 4.0
B 0.5
如果你现在要减去,比如第1行的第0行,你可以:
df.iloc[1].subtract(df.iloc[0])
得到:
COL_C -3.5
答案 2 :(得分:0)
我遇到这个问题是为了快速回答。这就是我最终的解决方案。
>>> df = pd.DataFrame(data=[[5,5,5,5], [3,3,3,3]], index=['r1', 'r2'])
>>> df
0 1 2 3
r1 5 5 5 5
r2 3 3 3 3
>>> df.loc['r3'] = df.loc['r1'] - df.loc['r2']
>>> df
0 1 2 3
r1 5 5 5 5
r2 3 3 3 3
r3 2 2 2 2
>>>