python - 在 Pandas 中按条件分配值(value)的最佳方式

标签 python pandas pandas-groupby

识别子组中的最大值并根据是否为最大值分配每行值的正确方法是什么? 这是一个示例 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.whereIndex.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/

相关文章:

python - 括号类型的变化改变了返回的类型

python - 如何在谷歌colab中安装web3

python - 使用 Latex 进行渲染时,如何更改 matplotlib 图中的轴刻度字体?

python - Pandas 数据框 : How to cut a dataframe using custom ways?

php - Python 从搜索结果中抓取链接

python - 用于更新数据帧 Python 中现有数据的检查器

python - 如何使用 pandas 和每月 groupby 绘制时间序列?

python - pandas groupby 在最终结果中包含一列

python-3.x - Pandas 列中的 min() 函数

python - Pandas :分组依据和数据透视表的区别