You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:45:33