首页 > 解决方案 > 使用python从文本文件中交叉行

问题描述

我有许多文本文件,其中包含文本和数字条目。更具体地说,所有这些文件的前两行和第一列都是文本,所有其他条目都是由数字组成的。例如,让我们考虑三个单独的文本文件(文件 A、B 和 C),其格式如下所示。

档案一:

Type    A1  A2  A3  A4  A5
Tag TagA1   TagA1   TagA1   TagA2   TagA2
object1 1.1 2.1 3.1 4.1 5.1
object2 1.2 2.2 3.2 4.2 5.2
object4 1.4 2.4 3.4 4.4 5.4
object7 1.7 2.7 3.7 4.7 5.7
object8 1.8 2.8 3.8 4.8 5.8
object9 1.9 2.9 3.9 4.9 5.9

文件 B:

Type    B1  B2  
Tag TagB1   TagB2   
object1 11.1    12.1    
object3 11.3    12.3    
object4 11.4    12.4    
object5 11.5    12.5    
object7 11.7    12.7    
object9 11.9    12.9    

文件 C:

Type    C1  C2  C3  C4  
Tag TagC1   TagC1   TagC2   TagC2   
object1 21.1    22.1    23.1    24.1    
object4 21.4    22.4    23.4    24.4    
object5 21.5    22.5    23.5    24.5    
object6 21.6    22.6    23.6    24.6    
object7 21.7    22.7    23.7    24.7    
object9 21.9    22.9    23.9    24.9    

我想使用 python 创建一个单独的文本文件,其中仅包含所有这三个文件中存在的那些行(从第 3 行开始)(即行的交集)。该最终文本文件应保留所有这三个文件中的相关列。以下将是我想要的最终文件:

Type    A1  A2  A3  A4  A5  B1  B2  C1  C2  C3  C4
Tag TagA1   TagA1   TagA1   TagA2   TagA2   TagB1   TagB2   TagC1   TagC1   TagC2   TagC2
object1 1.1 2.1 3.1 4.1 5.1 11.1    12.1    21.1    22.1    23.1    24.1
object4 1.4 2.4 3.4 4.4 5.4 11.4    12.4    21.4    22.4    23.4    24.4
object7 1.7 2.7 3.7 4.7 5.7 11.7    12.7    21.7    22.7    23.7    24.7
object9 1.9 2.9 3.9 4.9 5.9 11.9    12.9    21.9    22.9    23.9    24.9

我意识到我可以使用 pandas 使用如下命令导入每个提到的文本文件:

df = pd.read_csv('filename.txt',sep='\t', header=[0,1], index_col=0)

有了文件 A、B 和 C 后,如何使用 python 制作这个最终文件?我想为此使用 python 2.7。

标签: pythonpython-2.7pandas

解决方案


使用pd.merge()-

from functools import reduce
dfs = [df1, df2, df3]
df_final = reduce(lambda left,right: pd.merge(left,right,on=None,left_index=True,right_index=True), dfs)

或者

df1.join(df2, how='inner').join(df3, how='inner')

这些为您提供了一种通过钥匙加入的万无一失的方式 -

   Type       A1    A2    A3    A4    A5    B1    B2    C1    C2    C3    C4
    Tag     TagA1 TagA1 TagA1 TagA2 TagA2 TagB1 TagB2 TagC1 TagC1 TagC2 TagC2
    object1   1.1   2.1   3.1   4.1   5.1  11.1  12.1  21.1  22.1  23.1  24.1
    object4   1.4   2.4   3.4   4.4   5.4  11.4  12.4  21.4  22.4  23.4  24.4
    object7   1.7   2.7   3.7   4.7   5.7  11.7  12.7  21.7  22.7  23.7  24.7
    object9   1.9   2.9   3.9   4.9   5.9  11.9  12.9  21.9  22.9  23.9  24.9

计时

@黑暗的

2.63 ms ± 598 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Vivek

2.9 ms ± 252 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Vivek(第二次 - 使用连接)

5.4 ms ± 662 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

由于按键操作没有任何麻烦,@Dark 的解决方案效率稍高一些。但是由于提到的 OP仅包含所有这三个文件中存在的那些行(从第 3 行开始),所以merge顺路而不是concat顺路


推荐阅读