如何将DataFrame每行按指定列表元素重复并添加对应列?
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame({'A': ['foo', 'bar', 'dex', 'tru'], 'B': ['abc', 'def', 'ghi', 'jkl']})
显示效果:
A B 0 foo abc 1 bar def 2 dex ghi 3 tru jkl
同时有一个列表:
block_number = [1000, 2000]
期望生成的new_df如下:
new_df = pd.DataFrame({'A': ['foo', 'bar', 'dex', 'tru', 'foo', 'bar', 'dex', 'tru'], 'B': ['abc', 'def', 'ghi', 'jkl', 'abc', 'def', 'ghi', 'jkl'], 'block_number': [1000, 1000, 1000, 1000, 2000, 2000, 2000, 2000]})
显示效果:
A B block_number 0 foo abc 1000 1 bar def 1000 2 dex ghi 1000 3 tru jkl 1000 4 foo abc 2000 5 bar def 2000 6 dex ghi 2000 7 tru jkl 2000
需求为:让原DataFrame的每一行匹配列表中的每个元素,生成最终的DataFrame。
解决方案
方法1:交叉连接(最直观)
将列表转为DataFrame后,与原DataFrame做无关联条件的合并,实现笛卡尔积:
block_df = pd.DataFrame({'block_number': block_number}) new_df = pd.merge(df, block_df, how='cross')
方法2:循环拼接+赋值
遍历列表中的每个元素,为原DataFrame添加对应block_number列后拼接:
new_df = pd.concat([df.assign(block_number=num) for num in block_number], ignore_index=True)
方法3:重复行+广播列
通过重复原DataFrame的行,再为block_number列赋值重复的列表元素:
# 重复原DataFrame的行,次数等于列表长度 new_df = df.loc[df.index.repeat(len(block_number))].reset_index(drop=True) # 为block_number列赋值,每个列表元素重复原DataFrame行数的次数 new_df['block_number'] = pd.Series(block_number).repeat(len(df)).values
以上三种方法均可实现需求,其中pd.merge(how='cross')代码简洁,可读性最强。
内容的提问来源于stack exchange,提问作者Luiz Scheuer
相关产品推荐
相关产品推荐

