使用python的文本文件行的交集

2024-09-28 13:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些文本文件,其中有文本和数字条目。更具体地说,所有这些文件的前两行和第一列都是文本,所有其他条目都由数字组成。作为一个例子,让我们考虑三个单独的文本文件(文件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

文件B:

^{pr2}$

文件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来生成最终文件?我想使用Python2.7来实现这一点。在


Tags: 文件文本tagtype条目数字文本文件object1
2条回答

正如@Jamin所评论的那样,您可以直接使用join='inner'来保持最安全的一面,而不会丢失nan,即

df_m = pd.concat([A,B,C],axis=1,join='inner')

您还可以使用concatdropna,dropna将删除缺少值的行,这样您只剩下在所有文件中找到的行,即

^{pr2}$

如果您确认每个数据帧中都没有nan,那么这个解决方案仍然有效。在

使用^{}-

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)

^{pr2}$

这给了你一个简单的方法用钥匙连接-

   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)

@维维克

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

@Vivek(第二个-使用join)

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

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

相关问题 更多 >

    热门问题