python - 如何检查一个文件的每一行是否在另一个文件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 中找到匹配的行。但是,这种解决方案可能存在一些问题,因为我们处理的数据相对较大,这种方法(算法)可能会非常慢。
- 我想知道是否有一些 Python 内置库可以让我轻松检查这一点,比如 Pandas...(注意:第二个和最后一个字段的数据格式、类型不同,但数据相同)
- 如果没有库允许我直接做这些事情,是否有更好的算法可以让我实现目标?谢谢
解决方案
您有几个可用的选项,具体取决于您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
,然后告诉您哪些行对应于哪些DataFrame
s。
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
前两行出现在两者中df1
,df2
而底部两行仅出现在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