如何生成指定Pandas DataFrame所有列值的所有可能组合?
生成Pandas DataFrame所有列值的笛卡尔积组合
嘿,我来帮你搞定这个生成所有列值可能组合的需求!首先先看一下你的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'Student':['Siri','Alexa'], 'Class':['6', '7'], 'Section':['A','B'], 'Teacher':['Ravi','Mark'], 'School':['C','D'] })
你现在用的添加key然后多次merge的思路是完全可行的,我帮你把代码补全:
# 给原表添加统一的key列,用于笛卡尔积连接 df['key'] = 1 # 依次和每一列做外连接,逐步生成所有组合 df1 = pd.merge(df[['key','Student']], df[['key','Class']], on='key', how='outer') df2 = df1.merge(df[['key','Section']], on='key', how='outer') df3 = df2.merge(df[['key','Teacher']], on='key', how='outer') # 最后合并School列,并删除多余的key列 df_final = df3.merge(df[['key','School']], on='key', how='outer').drop('key', axis=1)
这个方法的核心是:因为所有子表的key值都相同(都是1),外连接会自动把每个子表的所有行和其他子表的所有行进行组合,也就是我们要的笛卡尔积。
不过还有更简洁的方法,用itertools.product直接生成所有组合,代码更短也更直观:
from itertools import product # 提取每一列的所有值 column_values = [df[col].tolist() for col in df.columns] # 生成所有列值的笛卡尔积组合 all_combinations = list(product(*column_values)) # 转换为DataFrame df_final = pd.DataFrame(all_combinations, columns=df.columns)
这个方法里,product(*column_values)会把每一列的取值作为独立的可迭代对象,生成所有可能的排列组合,最后直接转成DataFrame就搞定了。
两种方法最终都会生成32行数据(因为每列有2个值,2^5=32),结果完全一致,你可以根据自己的习惯选择使用~
内容的提问来源于stack exchange,提问作者Narendra Gadidasu
相关产品推荐
相关产品推荐

