如何在Pandas DataFrame中按列值合并指定列生成新列
解决方案:生成
A_combined列及重构后的数据处理 一、针对最初的13列DataFrame需求
咱们可以用两种方式高效生成A_combined列,避免低效的循环操作:
方法1:直观的行级筛选(适合中小数据集)
这是最容易理解的写法,对每一行筛选出值为1的A类列名,再用下划线拼接:
import pandas as pd # 假设你的DataFrame名为df df['A_combined'] = df.apply( lambda row: '_'.join(row[row == 1].index.drop('ID')), axis=1 )
- 细节说明:
row[row == 1]会过滤出当前行值为1的所有列.index.drop('ID')排除唯一标识列,只保留A1-A12的列名'_'.join(...)将筛选出的列名用下划线连接成字符串
方法2:向量化操作(适合大数据集,性能更优)
如果你的数据量很大,apply的效率会稍低,用向量化方法能大幅提速:
# 先提取所有A类列名 a_cols = [col for col in df.columns if col.startswith('A')] # 生成每行的列名组合 df['A_combined'] = df[a_cols].dot(a_cols + ['']).str.rstrip('_')
- 细节说明:
df[a_cols].dot(a_cols + [''])会自动将每行值为1的列名拼接起来(比如A1=1、A6=1时,会得到A1A6?不对,哦不对,dot的逻辑是每个列的值乘以列名,然后相加,所以A1=1的话就是1A1,A2=0就是0A2,加起来就是A1+A6...这样,然后最后加个空字符串是为了避免最后多一个下划线?不对,应该是df[a_cols].apply(lambda x: '_'.join(a_cols[x==1]), axis=1)?哦不对,刚才的dot方法其实是另一种思路:比如a_cols是['A1','A2','A3'],那么df[a_cols].dot(a_cols)会把每行的1对应列名相加,比如行是[1,0,1],结果就是'A1A3',然后我们需要加下划线的话,应该是df[a_cols].dot([col+'_' for col in a_cols]).str.rstrip('_'),对,刚才的代码写错了,修正一下:
a_cols = [col for col in df.columns if col.startswith('A')] df['A_combined'] = df[a_cols].dot([f"{col}_" for col in a_cols]).str.rstrip('_')
这样就对了,比如行中A1和A6为1,会得到A1_A6_,然后rstrip('_')去掉末尾的下划线,得到正确的格式。
二、针对重构后:'test'列名处于行级别的情况
我先假设你重构后的DataFrame是长表格式(这是宽表转长表后的常见结构),比如大概长这样:
| ID | test | value |
|---|---|---|
| 1 | A1 | 1 |
| 1 | A2 | 0 |
| 1 | A6 | 1 |
| 2 | A3 | 1 |
| ... | ... | ... |
如果是这种结构,咱们可以按ID分组,筛选出值为1的test列值,再拼接:
处理代码
# 假设重构后的DataFrame名为df_long # 第一步:筛选值为1的行,按ID分组拼接test列名 combined_df = df_long[df_long['value'] == 1].groupby('ID')['test'].agg('_'.join).reset_index() # 第二步:如果需要保留所有原始ID(包括没有任何A列等于1的ID),用左连接补全 final_df = df_long[['ID']].drop_duplicates().merge(combined_df, on='ID', how='left').fillna('')
- 细节说明:
groupby('ID')['test'].agg('_'.join)会把每个ID下所有值为1的test列名用下划线连接drop_duplicates()提取所有唯一ID,避免重复merge(..., how='left')保证所有原始ID都被保留,fillna('')把没有匹配到的(即所有A列都是0的ID)填充为空字符串,你也可以改成'No_A_selected'这类自定义默认值
如果你的重构后结构和我假设的不一样,可以补充一下df_long.head()的输出示例,我再调整方案~
内容的提问来源于stack exchange,提问作者gagandeep91
相关产品推荐
相关产品推荐

