如何在与特定的分组时替换值?

Posted

技术标签:

【中文标题】如何在与特定的分组时替换值?【英文标题】:How to replace value while grouping with specific one? 【发布时间】:2021-12-23 13:27:06 【问题描述】:

我有一个数据框:

id     type     val   
a1      q       100
a1      v       4
a1      l       17
b1      p       1
b1      j       700
b1      s       3

我想按 id 分组,并在列 val 中保留列类型和求和值。列类型中的值必须是具有最高 val 的值。所以期望的结果必须是:

id     type     val   
a1      q       121
b1      j       704

id a1 的类型是 q,因为它具有最高 val (100),b1 是 j,因为它具有最高 val (700)。该怎么做?

【问题讨论】:

在以后的问题中,请在工作代码中包含示例数据,这样人们就可以很容易地举出你的例子并提供答案。将它放在文本中肯定胜过使用图像,但在代码中定义数据框有助于在满足您需求的答案中提供工作代码。 【参考方案1】:

你可以试试这个:

df.sort_values(by='val', ascending=False).groupby('id').agg('type': 'first', 'val': 'sum')

它给出:

   type  val
id          
a1    q  121
b1    j  704

【讨论】:

【参考方案2】:
df_max = df.groupby(['id']).agg('val': 'max')[['id', 'type']]

df_sum = df.groupby(['id']).agg('val': 'sum')

df_sum.merge(df_max, on='id', how='left')

【讨论】:

【参考方案3】:

听起来这就是你所追求的:

import pandas as pd

df = pd.DataFrame([
    ['a1', 'q', 100],
    ['a1', 'v', 4],
    ['a1', 'l', 17],
    ['b1', 'p', 1],
    ['b1', 'j', 700],
    ['b1', 's', 3]
])
df.columns = ['id', 'type', 'val']

print(df.loc[df.groupby('id')['val'].idxmax()])

结果:

   id type  val
0  a1    q  100
4  b1    j  700

顺便说一句,您说“必须是最高值”,但在您想要的输出中,它实际上是这些值的 sum

如果总和是期望的结果,这可能会满足您的需求:

result = df.loc[df.groupby('id')['val'].idxmax()]
result.set_index('id', inplace=True)
result['val'] = df.groupby('id')['val'].sum()

结果:

   type  val
id          
a1    q  121
b1    j  704

请注意,val 列的名称现在可能会令人困惑,具体取决于实际应用程序,因为它不再是 val,而是真正的 sum(val)val_sum 等。

【讨论】:

它没有对 val 列中的值求和 类型来自对应的最大值,而val列是id组的总和【参考方案4】:

你的情况

out = df.set_index('type').groupby('id').val.agg(['sum','idxmax']).reset_index()
   id  sum idxmax
0  a1  121      q
1  b1  704      j

【讨论】:

以上是关于如何在与特定的分组时替换值?的主要内容,如果未能解决你的问题,请参考以下文章

当玩家在与 NPC 交互时选择特定的对话选项时,我如何执行某些操作?

如何在fluentd中用特定字符串替换键值字符串

如何在 Freemarker 中按特定值对列表进行分组?

ExtJs分组中的clearfilter后如何获取特定组的所有记录

如何按特定的子数组值对多维数组进行分组?

如何使用javascript对属性上的数组进行分组以在特定键处获得每个组的聚合值?