识别子组中的最大值并根据是否为最大值分配每行值的正确方法是什么? 这是一个示例 df:
group subgroup
A 1
B 1
A 2
A 3
A 4
B 2
C 2
C 1
规则是:
if subgroup = max then result = 1
else subgroup = 2
结果将是:
group subgroup result
A 1 2
B 1 2
A 2 2
A 3 2
A 4 1
B 2 1
C 2 1
C 1 2
我现在这样做:
df['subgroup_max'] = df.groupby(['group'])['subgroup'].nunique()
df3['result'] = 2
df3.loc[df3['result'] == df3['subgroup_max'],'result'] = 1
好像效率不是很高。但是有更好的方法吗?
最佳答案
您可以使用 DataFrameGroupBy.idxmax
对于每组 max
值的索引:
df['result'] = 2
idx = df.groupby(['group'])['subgroup'].idxmax()
df.loc[idx, 'result'] = 1
print (df)
group subgroup result
0 A 1 2
1 B 1 2
2 A 2 2
3 A 3 2
4 A 4 1
5 B 2 1
6 C 2 1
7 C 1 2
另一种解决方案 numpy.where
和 Index.isin
:
idx = df.groupby(['group'])['subgroup'].idxmax()
df['result'] = np.where(df.index.isin(idx), 1, 2)
print (df)
group subgroup result
0 A 1 2
1 B 1 2
2 A 2 2
3 A 3 2
4 A 4 1
5 B 2 1
6 C 2 1
7 C 1 2
idx = df.groupby(['group'])['subgroup'].idxmax()
df['result'] = (~df.index.isin(idx)).astype(int) + 1
print (df)
group subgroup result
0 A 1 2
1 B 1 2
2 A 2 2
3 A 3 2
4 A 4 1
5 B 2 1
6 C 2 1
7 C 1 2
但是如果每组有多个最大值并且需要为所有最大值分配值使用apply
:
print (df)
group subgroup
0 A 4
1 B 1
2 A 2
3 A 3
4 A 4
5 B 2
6 C 2
7 C 1
mask = df.groupby(['group'])['subgroup'].apply(lambda x: x == x.max())
df['result'] = np.where(mask, 1, 2)
print (df)
group subgroup result
0 A 4 1
1 B 1 2
2 A 2 2
3 A 3 2
4 A 4 1
5 B 2 1
6 C 2 1
7 C 1 2
关于python - 在 Pandas 中按条件分配值(value)的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44671470/