Python 对熊猫中的分组应用操作
编辑:我不是专门研究如何完成这项特定的操作工作,我需要这种行为来实现更复杂的功能。因此,为了回答这个问题,请假设该函数接受一个分组并返回一个对其进行了一些操作(但没有求和)的数据帧 假设我有这样一个数据帧:Python 对熊猫中的分组应用操作,python,pandas,grouping,Python,Pandas,Grouping,编辑:我不是专门研究如何完成这项特定的操作工作,我需要这种行为来实现更复杂的功能。因此,为了回答这个问题,请假设该函数接受一个分组并返回一个对其进行了一些操作(但没有求和)的数据帧 假设我有这样一个数据帧: import pandas as pd df = pd.DataFrame({ "page": [ 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 ], "x": [ 10, 12,
import pandas as pd
df = pd.DataFrame({
"page": [
1, 1, 1,
2, 2, 2,
3, 3, 3, 3
],
"x": [
10, 12, 21,
0, 5, 7,
1, 10, 33, 40
]
})
page x diff
0 1 10 2.0
1 1 12 9.0
2 1 21 NaN
3 2 0 5.0
4 2 5 2.0
5 2 7 NaN
6 3 1 9.0
7 3 10 23.0
8 3 33 7.0
9 3 40 NaN
我想计算每个x
在其相关页面中的差异
我设计它的方式是这样的:
def compute_diff(group):
return group.assign(
diff = [
*(group.x.values[1:] - group.x.values[0:len(group.x)-1]),
None
]
)
df.groupby('page').apply(compute_diff)
现在这很好,但问题是我得到了一个数据帧的数据帧,即:
page x diff
page
1 0 1 10 2.0
1 1 12 9.0
2 1 21 NaN
2 3 2 0 5.0
4 2 5 2.0
5 2 7 NaN
3 6 3 1 9.0
7 3 10 23.0
8 3 33 7.0
9 3 40 NaN
请注意,我的索引有点混乱,我如何才能清理它并获得更像这样的格式:
import pandas as pd
df = pd.DataFrame({
"page": [
1, 1, 1,
2, 2, 2,
3, 3, 3, 3
],
"x": [
10, 12, 21,
0, 5, 7,
1, 10, 33, 40
]
})
page x diff
0 1 10 2.0
1 1 12 9.0
2 1 21 NaN
3 2 0 5.0
4 2 5 2.0
5 2 7 NaN
6 3 1 9.0
7 3 10 23.0
8 3 33 7.0
9 3 40 NaN
我尝试了一些使用unstack和reset_index的方法,但是结果并不是我想要的,而且我在文档中也没有注意到任何东西。使用
GroupBy.diff
怎么样
df.assign(diff=df.groupby('page').x.diff())
page x diff
0 1 10 NaN
1 1 12 2.0
2 1 21 9.0
3 2 0 NaN
4 2 5 5.0
5 2 7 2.0
6 3 1 NaN
7 3 10 9.0
8 3 33 23.0
9 3 40 7.0
如果您坚持使用
apply
,也可以使用group\u keys=False
:
df.groupby('page', as_index=False, group_keys=False).apply(compute_diff)
page x diff
0 1 10 2.0
1 1 12 9.0
2 1 21 NaN
3 2 0 5.0
4 2 5 2.0
5 2 7 NaN
6 3 1 9.0
7 3 10 23.0
8 3 33 7.0
9 3 40 NaN
使用
.iloc
和diff
df['diff']=df.groupby('page').x.apply(lambda x : -x.iloc[::-1].diff()).sort_index(level=0).values
df
Out[106]:
page x diff
0 1 10 2.0
1 1 12 9.0
2 1 21 NaN
3 2 0 5.0
4 2 5 2.0
5 2 7 NaN
6 3 1 9.0
7 3 10 23.0
8 3 33 7.0
9 3 40 NaN
我以那次行动为例。我的实际代码稍微复杂一些。我希望得到一个“行动”解决方案。@asosnovsky现在好点了吗?