Python 在数据帧中相互减去行
我认为这是一个相当简单的问题,但就是无法让代码正确运行。这是我的数据帧的简化版本Python 在数据帧中相互减去行,python,pandas,Python,Pandas,我认为这是一个相当简单的问题,但就是无法让代码正确运行。这是我的数据帧的简化版本 df = pd.DataFrame([['Jan', 'Apples', 10], ['Feb', 'Apples', 14], ['Jan', 'Oranges', 24], ['Feb', 'Oranges', 18]], columns = ['Month', 'Fruit', 'Sales']) Month Frui
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
然后我想计算两个新的行,即2月份的销售额减去1月份的销售额,按水果类型分组。我已经看到了diff函数,它显然可以与这个简化的数据帧一起工作。但我的实际数据帧要大得多,我要减去的值之间的周期数不是常数。所以我在寻找loc和groupby的产品(我想是吧)
非常感谢您的建议。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
或
您可以使用下面的自定义函数
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')
&您将得到各个水果月份之间的销售额差异。要确保从Jan
中减去Feb
的销售额,一个选项是将Month
列定义为pd.Categorical
,为类别
指定订单,并获取前两个销售
值中的差异
,这也将与其他月份一起使用:
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