选择列匹配且占用最大值

时间:2017-09-14 00:25:49

标签: python pandas dataframe

所以这是我的完整问题的简化版本,但如果它更通用,希望能帮助更多人。

所以我正在使用一个任意大的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]的情况下比较这样的行的提示,但是对于我来说,成员和组有太多不同的值来执行此操作。提前谢谢!

4 个答案:

答案 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