使用pandas合并大量数据帧的最佳策略

时间:2014-11-05 20:58:20

标签: python pandas dataframe

我正在尝试使用pandas将许多(几千个列的tsv文件)数据帧合并到一个csv文件中。我是pandas(和python)的新手,可以使用一些输入或方向。

我的数据框是从网页上抓取的列表上的观察数据,不包含标题。例如:

数据框1:

bluebird    34
chickadee   168
eagle       10
hawk        67
sparrow     2

数据框2:

albatross    56
bluebird     78
hawk         3
pelican      19
sparrow      178

我希望做的只是创建一个包含所有单个观察结果的主文件:

albatross     0     56
bluebird      34    78
chickadee     168   0
eagle         10    0
hawk          67    3
pelican       0     19
sparrow       2     178

我尝试使用pandas一次合并一个数据框:

import pandas as pd

df1 = pd.read_table("~/home/birds1.tsv", sep='\t')
df2 = pd.read_table("~/home/birds2.tsv", sep='\t')
merged = df1.merge(df1, df2, how="left").fillna("0")
merged.to_csv("merged.csv", index=False)

但我只收到一栏。我没有“鸟类”的主列表,但如果需要,我可以连接所有数据并对字典列表的唯一名称进行排序。

我的策略应该是合并几千个文件?

2 个答案:

答案 0 :(得分:2)

查看merge的文档,从框架调用时,第一个参数是'其他'框架,第二个是您要合并的变量(实际上并不确定传递DataFrame时会发生什么)。

但是,假设你的鸟专栏名为“鸟类”,你可能想要的是:

In [412]: df1.merge(df2, on='bird', how='outer').fillna(0)
Out[412]: 
        bird  value_x  value_y
0   bluebird       34       78
1  chickadee      168        0
2      eagle       10        0
3       hawk       67        3
4    sparrow        2      178
5  albatross        0       56
6    pelican        0       19

答案 1 :(得分:1)

我认为最快的方法是将要合并的列设置为索引,创建数据帧列表,然后pd.concat。像这样:

import os
import pandas as pd
directory = os.path.expanduser('~/home')
files = os.path.listdir(directory)
dfs = []
for filename in files:
    if '.tsv' in file:
        df = pd.read_table(os.path.join(directory,filename),sep='\t').set_index('bird')
        dfs.append(df)
master_df = pd.concat(dfs,axis=1)