我正在尝试使用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)
但我只收到一栏。我没有“鸟类”的主列表,但如果需要,我可以连接所有数据并对字典列表的唯一名称进行排序。
我的策略应该是合并几千个文件?
答案 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)