Pandas技巧:如何基于两个DataFrame生成重复行并展开列的新表
Pandas实现DataFrame行重复与列值转列的最优方案
我有两个Pandas DataFrame,想要生成一个新的DataFrame:将df1的每一行按df2对应行的列数重复,同时把df2对应行的每个列值作为新行的Name列值。尝试用pd.concat拼接后再用pd.wide_to_long处理,但返回空DataFrame,求最优实现方法。
数据示例
import pandas as pd data = [10,20,30,40,50,60] df1 = pd.DataFrame(data, columns=['Numbers']) # df1内容: # Numbers # 0 10 # 1 20 # 2 30 # 3 40 # 4 50 # 5 60 data = {'name':['pro','lop1','lo','p','ll','qi'], 'name2':['pro2','lop2','lol','po','llop','qiij'], 'names':['pro1','lop3','lol1','ppp','lop','qis']} df2 = pd.DataFrame(data) # df2内容: # name name2 names # 0 pro pro2 pro1 # 1 lop1 lop2 lop3 # 2 lo lol lol1 # 3 p po ppp # 4 ll llop lop # 5 qi qiij qis
尝试的代码
new_df=pd.concat([df1,df2],axis=1) final = (pd.wide_to_long(new_df,stubnames=['Names'], i=['Numbers'], j='drop').reset_index().drop('drop', 1)) print(final) # 返回空DataFrame
预期输出
Numbers Name 10 pro 10 pro2 10 pro1 20 lop1 20 lop2 20 lop3 30 lo 30 lol 30 lol1 40 p 40 po 40 ppp 50 ll 50 llop 50 lop 60 qi 60 qiij 60 qis
问题原因
你用pd.wide_to_long返回空DataFrame的核心原因是:stubnames参数需要匹配列名的前缀,你的df2列名是name、name2、names,前缀为name而非Names,导致无法匹配到目标列,最终返回空结果。
最优实现方法
方法一:使用melt(推荐,代码简洁直观)
先拼接df1和df2,再用melt将df2的多列转为单行的Name值,自动完成行重复:
new_df = pd.concat([df1, df2], axis=1) final = new_df.melt(id_vars=['Numbers'], value_name='Name').drop('variable', axis=1) # 按Numbers排序并重置索引(可选,匹配预期输出格式) final = final.sort_values('Numbers').reset_index(drop=True) print(final)
方法二:使用repeat+stack(逻辑清晰,适合理解底层过程)
手动实现行重复和列转置,再合并结果:
# 让df1的每一行重复df2列数的次数 df1_repeated = df1.loc[df1.index.repeat(len(df2.columns))].reset_index(drop=True) # 将df2的所有列堆叠为一列,并重命名为Name df2_stacked = df2.stack().reset_index(drop=True).rename('Name') # 合并两个结果DataFrame final = pd.concat([df1_repeated, df2_stacked], axis=1) print(final)
两种方法都能精准输出预期结果,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者data en
相关产品推荐
相关产品推荐

