如何在Pandas中提取列唯一值并映射另一列非关联项?
解决方案
可以通过生成Col1唯一值与Col2唯一值的笛卡尔积,再和原始数据合并来实现需求,具体步骤如下:
1. 构造示例数据(模拟你的原始DataFrame)
import pandas as pd data = { 'Col1': ['D1', 'D1', 'D1', 'D2', 'D2', 'D4'], 'Col2': ['C38', 'C65', 'C53', 'C02', 'C01', 'C73'], 'Label': [1, 1, 1, 1, 1, 1] } df = pd.DataFrame(data)
2. 生成所有可能的Col1-Col2组合
先提取Col1和Col2的所有唯一值,再生成它们的笛卡尔积(即所有可能的配对):
# 获取Col1、Col2的唯一值集合 unique_col1 = df['Col1'].unique() unique_col2 = df['Col2'].unique() # 生成所有可能的组合 all_pairs = pd.MultiIndex.from_product( [unique_col1, unique_col2], names=['Col1', 'Col2'] ).to_frame(index=False)
3. 合并原始数据并标记Label值
将所有组合与原始DataFrame合并,原始存在的配对保留Label=1,不存在的配对填充Label=0:
# 左连接合并,保留所有组合 result = all_pairs.merge(df, on=['Col1', 'Col2'], how='left') # 填充缺失的Label为0,并转为整数类型 result['Label'] = result['Label'].fillna(0).astype(int)
4. 查看结果
运行后result就是你需要的输出:
Col1 Col2 Label 0 D1 C38 1 1 D1 C65 1 2 D1 C53 1 3 D1 C02 0 4 D1 C01 0 5 D1 C73 0 6 D2 C38 0 7 D2 C65 0 8 D2 C53 0 9 D2 C02 1 10 D2 C01 1 11 D2 C73 0 12 D4 C38 0 13 D4 C65 0 14 D4 C53 0 15 D4 C02 0 16 D4 C01 0 17 D4 C73 1
补充说明
- 如果你的
Col2包含更多未在示例中列出的值(比如你提到的C61、C03),只需确保这些值存在于原始DataFrame的Col2列中,代码会自动提取所有唯一值并生成对应组合。 - 这种方法逻辑清晰,利用Pandas内置方法高效处理配对和合并,避免手动循环。
内容的提问来源于stack exchange,提问作者botloggy
相关产品推荐
相关产品推荐

