Python中合并不同行数的Pandas DataFrame,避免出现NaN值
解决方法
针对你的需求,有几种简单直接的方式可以实现:
方法1:合并后用向前填充(ffill)补全NaN
这是最快捷的方式,适合你的场景——短DataFrame只有单个值,合并后直接将NaN填充为已有值:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'col1': [1]}) df2 = pd.DataFrame({'col2': [5]}) df3 = pd.DataFrame({'col3': [7, 8, 9]}) # 先合并 combined = pd.concat([df1, df2, df3], axis=1) # 向前填充NaN result = combined.ffill()
运行后result就是你要的预期结果,ffill()会把每列的非NaN值向下填充,覆盖所有NaN位置。
方法2:直接给长DataFrame添加固定列
如果确定短DataFrame只有单个值,可以直接提取这个值,给行数最多的DataFrame(这里是df3)新增列:
import pandas as pd df1 = pd.DataFrame({'col1': [1]}) df2 = pd.DataFrame({'col2': [5]}) df3 = pd.DataFrame({'col3': [7, 8, 9]}) # 直接添加列,值为对应DataFrame的唯一值 result = df3.assign(col1=df1['col1'].iloc[0], col2=df2['col2'].iloc[0]) # 调整列顺序匹配预期(可选) result = result[['col1', 'col2', 'col3']]
这种方法效率更高,不需要处理合并后的NaN,直接构造目标DataFrame。
方法3:重复短DataFrame的行再合并
如果短DataFrame有多个值,需要将这些值重复到与最长DataFrame行数一致,再合并:
import pandas as pd df1 = pd.DataFrame({'col1': [1]}) df2 = pd.DataFrame({'col2': [5]}) df3 = pd.DataFrame({'col3': [7, 8, 9]}) # 获取最大行数 max_rows = max(len(df1), len(df2), len(df3)) # 重复短DataFrame的行并重置索引 df1_repeated = df1.loc[df1.index.repeat(max_rows)].reset_index(drop=True) df2_repeated = df2.loc[df2.index.repeat(max_rows)].reset_index(drop=True) # 合并所有DataFrame result = pd.concat([df1_repeated, df2_repeated, df3], axis=1)
这种方法更通用,即使短DataFrame有多行数据,也能按原行顺序重复填充到目标行数。
内容的提问来源于stack exchange,提问作者Jesús Roldán Cadena
相关产品推荐
相关产品推荐

