我正在解析来自不同目录的数百个.tsv文件。每个文件只有2列,其目的是在一列中使用索引进行连接。
df1=pd.DataFrame({ 'A':['name1.0', 'name2.0', 'name3.0'], 'B':[4., 3., 2.]})
df2=pd.DataFrame({ 'A':['name1.0', 'name3.0', 'name4.0', 'name5.3'], 'B':[3., 4., 5., 0.]})
问题:
在python / pandas中执行此操作的有效方法是什么?
使用上面的df1
和df2
,我们的想法是根据转换的索引连接数据帧。例如:
df1.index=[re.sub('\..+$','',i) for i in df1.loc[:,'A']]
df2.index=[re.sub('\..+$','',i) for i in df2.loc[:,'A']]
out=pd.concat([df1.loc[:,'B'],df2.loc[:,'B']],axis=1)
out
有更有效的方法吗?提前谢谢你
答案 0 :(得分:1)
这里有一种允许你一次加载并且做一个轴= 0 concat的方法:
在该示例中使用名为fileid
的额外列加载文件,以便识别来自给定文件的行。您应该能够在加载循环中执行此操作
df1
Out[189]:
A B fileid
0 name1.0 4.0 1
1 name2.0 3.0 1
2 name3.0 2.0 1
df2
Out[190]:
A B fileid
0 name1.0 3.0 2
1 name3.0 4.0 2
2 name4.0 5.0 2
3 name5.3 0.0 2
对您的专栏进行一次清理A
:
df = pd.concat([df1, df2])
df.A = df.A.str.split('.', n=1, expand=True)[0]
df
Out[183]:
A B fileid
0 name1 4.0 1
1 name2 3.0 1
2 name3 2.0 1
0 name1 3.0 2
1 name3 4.0 2
2 name4 5.0 2
3 name5 0.0 2
透视它。列通过它们来自fileid
:
df.pivot('A', 'fileid', 'B')
Out[192]:
fileid 1 2
A
name1 4.0 3.0
name2 3.0 NaN
name3 2.0 4.0
name4 NaN 5.0
name5 NaN 0.0
对于更多的受众群体,我发现这种方法很有优势,因为当我们处理更多文件或者我们想要并行化计算时,这种方法非常适合dask
:您应用simple recipe here得到dask并行加载你的文件和同时添加fileid
列。现在,您可以“免费”并行地计算整个结果数据帧(比如还有5行代码,包括import dask
语句...)