我所假设的是一个相当简单的问题,但无法获得正确的代码以使其正常工作。这是我的数据框的简化版本。
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(我认为)。
非常感谢任何建议。
答案 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