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

如何在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是长表格式(这是宽表转长表后的常见结构),比如大概长这样:

IDtestvalue
1A11
1A20
1A61
2A31
.........

如果是这种结构,咱们可以按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:05:06