基于分组操作给DataFrame添加条件匹配的新列
基于分组操作给DataFrame添加条件匹配的新列
嗨,我来帮你搞定这个需求!你想要按ID分组后,给每行添加col2和col3,分别对应组内col1为BX和AX的value值对吧?用Pandas的分组(groupby)结合transform方法就能轻松实现,下面是具体步骤:
首先先把你的原始数据构建成DataFrame:
import pandas as pd df = pd.DataFrame({ 'ID': ['A', 'A', 'B', 'B', 'C', 'C'], 'value': [1, 2, 3, 4, 5, 6], 'col1': ['BX', 'AX', 'AX', 'BX', 'BX', 'AX'] })
接下来有两种写法,一种是自定义函数更清晰,另一种是用lambda更简洁:
方法一:自定义分组处理函数
我们可以为提取BX、AX对应的value分别写函数,再用transform把结果广播到组内每一行:
def get_bx_val(group): # 从分组中筛选col1为BX的行,取第一个value return group[group['col1'] == 'BX']['value'].iloc[0] def get_ax_val(group): # 从分组中筛选col1为AX的行,取第一个value return group[group['col1'] == 'AX']['value'].iloc[0] # 添加新列 df['col2'] = df.groupby('ID').transform(get_bx_val) df['col3'] = df.groupby('ID').transform(get_ax_val)
方法二:用lambda表达式简化代码
如果觉得写函数麻烦,也可以直接用lambda表达式一行搞定:
df['col2'] = df.groupby('ID')['value'].transform( lambda x: x[df.loc[x.index, 'col1'] == 'BX'].iloc[0] ) df['col3'] = df.groupby('ID')['value'].transform( lambda x: x[df.loc[x.index, 'col1'] == 'AX'].iloc[0] )
两种方法运行后,都会得到你想要的结果:
| ID | value | col1 | col2 | col3 |
|---|---|---|---|---|
| A | 1 | BX | 1 | 2 |
| A | 2 | AX | 1 | 2 |
| B | 3 | AX | 4 | 3 |
| B | 4 | BX | 4 | 3 |
| C | 5 | BX | 5 | 6 |
| C | 6 | AX | 5 | 6 |
这里要说明下:transform的作用是把分组后的计算结果映射回原DataFrame的每一行,确保每个ID组内的所有行都能拿到对应组的BX、AX值。如果你的实际数据中,某个ID组可能有多个BX/AX的行,iloc[0]会取第一个匹配的值,你可以根据需求改成mean()(取平均值)或者其他聚合方式哦~
备注:内容来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

