使用python从文本文件中交叉行

Lin*_*Guo 2 python python-2.7 pandas

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

文件A:

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
Run Code Online (Sandbox Code Playgroud)

档案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    
Run Code Online (Sandbox Code Playgroud)

文件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    
Run Code Online (Sandbox Code Playgroud)

我想使用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
Run Code Online (Sandbox Code Playgroud)

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

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

一旦我有文件A,B和C,我如何使用python制作这个最终文件?我想用python 2.7.

Viv*_*gan 6

使用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)
Run Code Online (Sandbox Code Playgroud)

要么

df1.join(df2, how='inner').join(df3, how='inner')
Run Code Online (Sandbox Code Playgroud)

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

   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
Run Code Online (Sandbox Code Playgroud)

计时

@暗

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

@Vivek

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

@Vivek(第二名 - 使用加入)

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

由于按键没有麻烦,@ Dark的解决方案效率稍高.但是由于提到的OP 只包含那些存在于所有这三个文件中的行(从第3行开始),所以我merge顺便说一句,而不是那种concat方式