基于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_text | child_desc_text | cost | uid | |
|---|---|---|---|---|
| 0 | Pen | orange | 0.00 | 12705024 |
| 1 | Pen | red | 1.20 | 12705087 |
| 2 | Pen | green | 1.98 | 12705093 |
| 3 | Pen | brown | 0.00 | 12705087 |
| 4 | Pen | yellow | 0.00 | 12705093 |
| 5 | Pen | black | 0.00 | 12705093 |
| 6 | Pen | silver | 0.00 | 12705024 |
需求:根据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_text | child_desc_text | cost | uid | |
|---|---|---|---|---|
| 0 | Pen | orange | 0.00 | 12705024 |
| 1 | Pen | red | 1.20 | 12705087 |
| 2 | Pen | green | 1.98 | 12705093 |
| 3 | Pen | brown | 1.20 | 12705087 |
| 4 | Pen | yellow | 1.98 | 12705093 |
| 5 | Pen | black | 1.98 | 12705093 |
| 6 | Pen | silver | 0.00 | 12705024 |
已尝试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)
逻辑解释
df.groupby('uid')['cost'].max():按uid分组后,提取每组cost的最大值,得到以uid为索引的Series.to_dict():将上述Series转为字典,键为uid,值为对应组的最大costdf['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
相关产品推荐
相关产品推荐

