如何基于列重复Pandas DataFrame行?求内置方法实现方案
解决方案
你需要的是col1的所有值(包括重复项)和col2、col3的所有行(包括重复项)的笛卡尔积,用Pandas的内置方法就能实现,这里给你几种可行方案:
方法1:用merge做交叉合并
先拆分出col1的单列数据,再拆分出col2和col3的所有行,然后通过无关联条件的merge生成笛卡尔积:
# 拆分出col1列(保留所有重复值) col1_df = df[['col1']] # 拆分出col2和col3的所有行(保留原数据的重复行) col23_df = df[['col2', 'col3']] # 交叉合并生成笛卡尔积 df_new = col1_df.merge(col23_df, how='cross')
方法2:用itertools.product配合DataFrame构造
借助Python标准库的itertools.product生成所有组合,再转成DataFrame:
import itertools # 生成col1每个值和col2-col3每一行的笛卡尔积 combinations = itertools.product(df['col1'], df[['col2', 'col3']].itertuples(index=False)) # 整理成目标格式的DataFrame df_new = pd.DataFrame([(val, row[0], row[1]) for val, row in combinations], columns=['col1', 'col2', 'col3'])
方法3:Pandas 2.1+ 用cross_merge(最简洁)
Pandas 2.1.0及之后的版本新增了cross_merge函数,专门用来生成交叉合并结果,代码最直观:
df_new = df[['col1']].cross_merge(df[['col2', 'col3']])
验证重复行场景
针对你给出的含重复col1的示例,上面三种方法都能得到你预期的结果。比如用cross_merge处理:
df = pd.DataFrame({'col1': [1, 2, 2], 'col2': [4, 5, 6], 'col3': [7, 8, 8]}) df_new = df[['col1']].cross_merge(df[['col2', 'col3']]) print(df_new)
输出结果:
col1 col2 col3 0 1 4 7 1 1 5 8 2 1 6 8 3 2 4 7 4 2 5 8 5 2 6 8 6 2 4 7 7 2 5 8 8 2 6 8
所有方法都会保留原数据中的重复行,生成对应的交叉组合。
内容的提问来源于stack exchange,提问作者Erniu
相关产品推荐
相关产品推荐

