2014-11-05 96 views
0

我想使用熊猫将许多(几千列tsv文件)数据帧合并到一个csv文件中。我是熊猫新手(和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 

我试图合并使用熊猫一次的数据帧:

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) 

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

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

+0

索引和列的名称是什么? – 2014-11-05 21:06:14

+0

提供给我的数据框没有索引或列名。我想我可以将它们添加到现有数据中,但这会增加一个步骤 - 很容易在命令行中进行。感谢西蒙! – 2014-11-14 18:33:28

回答

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) 
1

查看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