首页 > 解决方案 > 如何检查一个文件的每一行是否在另一个文件Python中

问题描述

文件1:

2018-06-07, AAA, 26543.0, 123, 0.0
2018-06-07, AAA, 26512.0, 123, 1.0

文件2:

20180608, B, 12345, 343, 0
20180607, AAA, 26512, 123, 1
20180608, C, 123, 343, 0
20180607, AAA, 26543, 123, 0

现在,我可以找到一种方法,对于 file1 中的每一行,我只需对其进行处理并尝试在 file2 中找到匹配的行。但是,这种解决方案可能存在一些问题,因为我们处理的数据相对较大,这种方法(算法)可能会非常慢。

  1. 我想知道是否有一些 Python 内置库可以让我轻松检查这一点,比如 Pandas...(注意:第二个和最后一个字段的数据格式、类型不同,但数据相同)
  2. 如果没有库允许我直接做这些事情,是否有更好的算法可以让我实现目标?谢谢

标签: pythonpandas

解决方案


您有几个可用的选项,具体取决于您DataFrame的 s 有多大以及您想要什么。

首先,使用相同的格式获取日期pd.to_datetime。还要确保每个列的名称相同df

import pandas as pd
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'], format='%Y%m%d')

print(df1)
        date val1     val2  val3  val4
0 2018-06-07  AAA  26543.0   123   0.0
1 2018-06-07  AAA  26512.0   123   1.0

print(df2)
        date val1   val2  val3  val4
0 2018-06-08    B  12345   343     0
1 2018-06-07  AAA  26512   123     1
2 2018-06-08    C    123   343     0
3 2018-06-07  AAA  26543   123     0

pd.merge

您可以使用参数执行outer合并indicator,然后告诉您哪些行对应于哪些DataFrames。

pd.merge(df1, df2, how='outer', indicator=True)

输出:

        date val1     val2  val3  val4      _merge
0 2018-06-07  AAA  26543.0   123   0.0        both
1 2018-06-07  AAA  26512.0   123   1.0        both
2 2018-06-08    B  12345.0   343   0.0  right_only
3 2018-06-08    C    123.0   343   0.0  right_only

前两行出现在两者中df1df2而底部两行仅出现在df2. 如果您只关心共享行,那么只需使用inner合并。

pd.merge(df1, df2, how='inner')
        date val1   val2  val3 val4
0 2018-06-07  AAA  26543   123    0
1 2018-06-07  AAA  26512   123    1

duplicated

如果df1并且df2不包含任何重复的行,那么您也可以将两者连接起来,然后在连接中查找重复的行df以查看两个框架之间共享的行。

df = pd.concat([df1, df2])
df[df.duplicated()]

输出:

        date val1     val2  val3  val4
1 2018-06-07  AAA  26512.0   123   1.0
3 2018-06-07  AAA  26543.0   123   0.0

推荐阅读