python - 使用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。
解决方案
使用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
顺路
推荐阅读
- node.js - EACCES:通过 Microsoft Azure 部署 node.js Web 应用程序时权限被拒绝
- reactjs - 使用 Apollo 和 Graphql(serius 项目)为 Reacjs 提供一些架构建议?
- c# - 使用 WMI 列出映射的网络驱动器
- neural-network - 使用 ReLU 进行反向传播 - 理解计算
- julia - 语法“|>”在 Julia 中有什么作用?
- corda - 构建 Corda 示例项目时出现 log4j 错误
- javascript - 如何在 Firebase Firestore 完成之前暂停 Javascript MAP?Promise、Async/Await 或两者兼有
- node.js - 如何在没有守卫装饰器的情况下始终验证 JWT?(Nest.js + 护照)
- java - h2 在处理 qnap 服务器上的许多文件的 h2 上用完文件描述符
- batch-file - 打开适合模型的正确版本的 EB GUIDE