在Pandas DataFrame

时间:2016-06-21 02:29:22

标签: python pandas indexing dataframe loc

我想在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会解决这个问题。

3 个答案:

答案 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
>>>