在数据框中彼此减去行

时间:2019-10-01 07:57:01

标签: python pandas

我所假设的是一个相当简单的问题,但无法获得正确的代码以使其正常工作。这是我的数据框的简化版本。

df = pd.DataFrame([['Jan', 'Apples', 10], ['Feb', 'Apples', 14], 
                   ['Jan', 'Oranges', 24], ['Feb', 'Oranges', 18]],
                    columns = ['Month', 'Fruit', 'Sales'])

  Month    Fruit  Sales
0   Jan   Apples     10
1   Feb   Apples     14
2   Jan  Oranges     24
3   Feb  Oranges     18

然后,我想计算两个新行,即Febraury的销售额减去按水果类型分组的一月份的销售额。我已经看到了diff函数,该函数显然可以与此简化的数据框一起使用。但是我的实际数据帧要大得多,并且要减去的值之间的周期数不是恒定的。所以我正在寻找loc和groupby(我认为)。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

IICU,这就是您所需要的。随着月份数的增加,这将使两个月之间的销售额有所不同。

df['dif']= df.groupby(['Fruit'])['Sales'].diff().fillna(0).astype(int)
print(df)

输出

    Month   Fruit   Sales   dif
0   Jan     Apples      10  0
1   Feb     Apples      14  4
2   Jan     Oranges     24  0
3   Feb     Oranges     18  -6

OR

您可以在下面使用自定义功能

def func(mon1,mon2,fruit):
    g = df.groupby(['Fruit'])
    f = g.get_group(fruit)
    a = f.loc[f.Month == mon1, 'Sales'].iloc[0]
    b = f.loc[f.Month == mon2, 'Sales'].iloc[0]
    return b-a

将函数调用为,例如func('Jan', 'Feb', 'Oranges'),您将获得各个水果月份之间的销售额差异。

答案 1 :(得分:0)

为确保您从Feb中减去Jan中的销售额,一种选择是将Month列定义为pd.Categorical,并指定categories,并采用两个前diff个值中的Sales,这也可以使用额外的月份:

   Month    Fruit  Sales
0   Jan   Apples     10
2   Apr   Apples     21
3   Feb   Apples     14
4   Apr   Apples     21
5   Jan  Oranges     24
6   Feb  Oranges     18

df['Month'] = pd.Categorical(df.Month.tolist(), categories=['Jan', 'Feb'])
df.sort_values('Month', inplace=True)
df.groupby('Fruit').Sales.apply(lambda x: x.head(2).diff().iloc[1])

Fruit
Apples     4.0
Oranges   -6.0
Name: Sales, dtype: float64
​