所以这是我的完整问题的简化版本,但如果它更通用,希望能帮助更多人。
所以我正在使用一个任意大的Pandas DataFrame(大到足以不写一堆简单的条件)。说它看起来像这样:
member group score
1 1 56
1 1 432
1 1 43
2 1 44
2 1 555
2 2 90
2 2 101
并说这个清单还有很长一段时间。我的目标是仅比较具有相同成员和组的行的得分与另一行,并且不仅取这些行的最大值而且取其最大值并将其存储在新数据帧中。例如,完成的数据框看起来像:
member group max max by
1 1 432 376
2 1 555 511
2 2 101 11
我不知道,我没有找到任何关于如何在不说df['member'==1]
的情况下比较这样的行的提示,但是对于我来说,成员和组有太多不同的值来执行此操作。提前谢谢!
答案 0 :(得分:1)
据我了解,您想知道每组中的最大值以及最大值大于该组第一行中的得分:
df1 = df.groupby(["group", "member"]).agg(["first", "max"]).reset_index()
df1.columns = "member", "group", "first", "max"
df1["max by"] = df1["max"] - df1["first"]
# member group first max max by
#0 1 1 56 432 376
#1 1 2 44 555 511
#2 2 2 90 101 11
答案 1 :(得分:1)
使用np.ptp
将pandas导入为pd
导入numpy为np
df.groupby(['member','group'])['score'].agg({'max':'max','max by':np.ptp}).reset_index()
Out[8]:
member group max max by
0 1 1 432 389
1 2 1 555 511
2 2 2 101 11
编辑:我会保留" worng"一个在这里:)因为我喜欢这个np.ptp
在这里:〜)
df.groupby(['member','group'])['score'].agg({'max':'max','max by':lambda g: g.max() - g.iloc[0]}).reset_index()
Out[17]:
member group max max by
0 1 1 432 376
1 2 1 555 511
2 2 2 101 11
答案 2 :(得分:1)
与DYZ's answer类似,更清洁。
df.groupby(['member', 'group']).score.agg(['max', 'first'])
df = df.assign(max_by=df.diff(-1, axis=1)['max'])\
.drop('first', 1).reset_index()
df
member group max max_by
0 1 1 432 376.0
1 2 1 555 511.0
2 2 2 101 11.0
答案 3 :(得分:0)
我认为删除列first
不是必需的,清除器会在assign
减去列后重命名:
df = (df.groupby(['member', 'group'])['score']
.agg(['max', 'first'])
.assign(first = lambda x: x['max'] - x['first'])
.rename(columns={'first':'max by'})
.reset_index())
print (df)
member group max max by
0 1 1 432 376
1 2 1 555 511
2 2 2 101 11