使用Pandas解析多个.tsv - 高效的索引和解析?

时间:2017-02-03 17:00:50

标签: python pandas dataframe

我正在解析来自不同目录的数百个.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.]})

问题:

  1. 必须解析用作索引的列;
  2. 文件可能包含不同的行数。
  3. 在python / pandas中执行此操作的有效方法是什么?

    使用上面的df1df2,我们的想法是根据转换的索引连接数据帧。例如:

    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
    

    有更有效的方法吗?提前谢谢你

1 个答案:

答案 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语句...)