pandas纵向拼接多DataFrame并忽略索引的方法
本文介绍如何使用pandas的concat函数在纵向拼接多个DataFrame时忽略原有索引。通过设置ignore_index=True参数,可生成连续的新索引,避免NaN值。同时涵盖横向拼接的axis=1用法,帮助处理不同列名的数据合并问题。
从Wind获取股票数据时,常遇到因季度差异导致列名不一致的问题,进而使pandas合并报表时产生大量NaN值。为此,编写了一个专用函数来解决此类表结构的合并难题。
其核心思路如下:
首先生成一组随机单词作为临时列名,将这些表的列索引全部替换为这些单词,然后调用 将这些DataFrame合并,最后再将列索引恢复为原始名称。当然,用户也可以手动指定列索引。
具体使用方法见代码最后一行,只需传入一个包含DataFrame的列表即可。
import pandas as pd
from random import Random
# 随机生成一堆单词作为公共的列名
def random_list(random_str_count, randomlengtd=6):
result_list = []
random = Random()
chars = "qwertyuiopasdfghjklzxcvbnm"
for str_count in range(random_str_count):
ranstr = ""
lengtd = len(chars) - 1
for str_lengtd in range(randomlengtd):
ranstr += chars[random.randint(0, lengtd)]
result_list.append(ranstr)
return result_list
def combine_as_data_location(pd_list, columns=''):
if not pd_list:
return None
old_columns = pd_list[0].columns
if columns:
new_columns = columns
else:
new_columns = random_list(pd_list[0].shape[1])
for data_df in pd_list:
# data is pandas Dataframe
data_df.columns = new_columns
result_df = pd.concat(pd_list, ignore_index=True)
if columns:
return result_df
else:
result_df.columns = old_columns
return result_df
result_df = combine_as_data_location([df1,df2,df3])
补充说明:pandas.concat实现竖着拼接、横着拼接DataFrame
1、concat竖着拼接(默认方向为竖直,axis=0)
直接通过示例演示:
import pandas as pd
df1=pd.DataFrame([10,12,13])
df2=pd.DataFrame([22,33,44,55])
df3=pd.DataFrame([90,94])
df1
| 0 | |
|---|---|
| 0 | 10 |
| 1 | 12 |
| 2 | 13 |
df2
| 0 | |
|---|---|
| 0 | 22 |
| 1 | 33 |
| 2 | 44 |
| 3 | 55 |
df3
| 0 | |
|---|---|
| 0 | 90 |
| 1 | 94 |
res= pd.concat([df1,df2,df3])
res
| 0 | |
|---|---|
| 0 | 10 |
| 1 | 12 |
| 2 | 13 |
| 0 | 22 |
| 1 | 33 |
| 2 | 44 |
| 3 | 55 |
| 0 | 90 |
| 1 | 94 |
若需生成新索引并忽略原有索引,应如何处理?
默认情况下,ignore_index参数为False,将其值改为True即可:
res2= pd.concat([df1,df2,df3], ignore_index=True)
res2
| 0 | |
|---|---|
| 0 | 10 |
| 1 | 12 |
| 2 | 13 |
| 3 | 22 |
| 4 | 33 |
| 5 | 44 |
| 6 | 55 |
| 7 | 90 |
| 8 | 94 |
2、concat横着拼接
使用参数axis=1,参考以下示例:
res_heng= pd.concat([df1,df2,df3], axis=1)
res_heng
| 0 | 0 | 0 | |
|---|---|---|---|
| 0 | 10.0 | 22 | 90.0 |
| 1 | 12.0 | 33 | 94.0 |
| 2 | 13.0 | 44 | NaN |
| 3 | NaN | 55 | NaN |
以上为个人经验分享,希望能为大家提供参考。如有错误或未考虑周全之处,欢迎指正。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









