如何拼接列名与长度均不同的多个DataFrame实现按行堆叠
你用pd.concat([df1, df2], axis=0)出现列并排的原因是该方法默认按列名对齐拼接,两个DataFrame列名不一致时会自动扩充总列数,对应DataFrame缺失的列填充NaN,就会出现你看到的效果。以下是两种符合不同需求的解决方案:
方案1:所有值堆叠为单列(无原有行列结构)
如果只需要把所有DataFrame的全部值按顺序上下堆叠成只有1列的结果,直接将每个DataFrame的值拉直后再拼接即可:
import pandas as pd # 所有待拼接的DataFrame放入列表 df_list = [df1, df2, df3] # 逐个处理为单列DataFrame后拼接 result = pd.concat( [pd.DataFrame(df.values.reshape(-1, 1)) for df in df_list], axis=0, ignore_index=True ) # 可自定义最终列名 result.columns = ['all_values']
方案2:保留原有行结构堆叠,重置列名
如果需要保留每个DataFrame原本的行结构(即原df1的每行3个值、df2的每行4个值的结构不变),仅做行的上下堆叠,不需要原列名,可以先把所有df的列名统一重置为数字索引后再拼接:
import pandas as pd df_list = [df1, df2, df3] processed_dfs = [] for df in df_list: tmp_df = df.copy() # 将列名重置为0、1、2...和当前df列数对应 tmp_df.columns = range(tmp_df.shape[1]) processed_dfs.append(tmp_df) # 拼接后自动按最大列数补全NaN,ignore_index重置行索引 result = pd.concat(processed_dfs, axis=0, ignore_index=True)
你可以根据自己的实际需求选择对应方案。
内容的提问来源于stack exchange,提问作者Anirban Nag 'tintinmj'
相关产品推荐
相关产品推荐

