You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于uid匹配的最大值填充DataFrame的cost列

问题

现有示例DataFrame:

example_df = {
    'parent_text': ['Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen'],
    'child_desc_text': ['orange' ,'red', 'green', 'brown', 'yellow', 'black', 'silver'],
    'cost': [0 ,1.20, 1.98, 0, 0, 0, 0],
    'uid': [12705024 ,12705087, 12705093, 12705087, 12705093, 12705093, 12705024]
}
df = pd.DataFrame(example_df)

对应表格:

parent_textchild_desc_textcostuid
0Penorange0.0012705024
1Penred1.2012705087
2Pengreen1.9812705093
3Penbrown0.0012705087
4Penyellow0.0012705093
5Penblack0.0012705093
6Pensilver0.0012705024

需求:根据uid列的匹配项,将cost列填充为对应匹配项中的最大值,无有效匹配项则保持0。

预期输出DataFrame:

expected_df = {
    'parent_text': ['Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen'],
    'child_desc_text': ['orange' ,'red', 'green', 'brown', 'yellow', 'black', 'silver'],
    'cost': [0 ,1.20, 1.98, 1.20, 1.98, 1.98, 0],
    'uid': [12705024 ,12705087, 12705093, 12705087, 12705093, 12705093, 12705024]
}
expected_df = pd.DataFrame(expected_df)

对应表格:

parent_textchild_desc_textcostuid
0Penorange0.0012705024
1Penred1.2012705087
2Pengreen1.9812705093
3Penbrown1.2012705087
4Penyellow1.9812705093
5Penblack1.9812705093
6Pensilver0.0012705024

已尝试np.where和np.select方法但未成功,寻求可行实现方案。

可行实现方案

可以通过分组计算最大值+映射填充的方式实现,步骤简洁且高效:

代码实现

import pandas as pd

# 生成示例DataFrame
example_df = {
    'parent_text': ['Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen', 'Pen'],
    'child_desc_text': ['orange' ,'red', 'green', 'brown', 'yellow', 'black', 'silver'],
    'cost': [0 ,1.20, 1.98, 0, 0, 0, 0],
    'uid': [12705024 ,12705087, 12705093, 12705087, 12705093, 12705093, 12705024]
}
df = pd.DataFrame(example_df)

# 1. 计算每个uid对应的cost最大值,转为字典映射
uid_max_cost = df.groupby('uid')['cost'].max().to_dict()

# 2. 用映射字典填充cost列
df['cost'] = df['uid'].map(uid_max_cost)

# 查看结果
print(df)

逻辑解释

  1. df.groupby('uid')['cost'].max():按uid分组后,提取每组cost的最大值,得到以uid为索引的Series
  2. .to_dict():将上述Series转为字典,键为uid,值为对应组的最大cost
  3. df['uid'].map(uid_max_cost):将每行的uid替换为字典中对应的最大cost,直接赋值给原cost列完成填充

如果需要保留原cost列中的非0值(本例中原非0值已是对应uid的最大值,结果一致),可以搭配np.where实现:

import numpy as np

df['cost'] = np.where(df['cost'] == 0, df['uid'].map(uid_max_cost), df['cost'])

内容的提问来源于stack exchange,提问作者DECROMAX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:57:25