[英]Compare each row in one dataframe to each row in another dataframe in Python
[英]Python CSV Reader - Compare Each Row with Each Other Row Within One Column
我想将CSV文件的每一行与其自身以及一列中的每一行进行比较。
例如,如果列值是这样的:
值_1
值_2
值_3
该代码应选择Value_1,并将其与Value_1(是,也与自身)进行比较,然后将Value_2与Value_3进行比较。 然后,它应该选择Value_2,并将其与Value_1,Value_2,Value_3等进行比较。
为此,我编写了以下代码:
csvfile = "c:\temp\temp.csv"
with open(csvfile, newline='') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
for compare_row in reader:
if row == compare_row
print(row,'is equal to',compare_row)
else:
print(row,'is not equal to',compare_row)
该代码提供以下输出:
['Value_1'] is not equal to ['Value_2']
['Value_1'] is not equal to ['Value_3']
该代码将Value_1与Value_2和Value_3进行比较,然后停止。 循环1不会选择Value_2和Value_3。 简而言之,第一个循环似乎在停止之前仅对CSV文件的第一行进行迭代。
另外,我无法使用此代码将Value_1与自身进行比较。 对解决方案有什么建议吗?
我建议将CSV加载到内存中,但是考虑到大小,这不是一个选择。
而是将其视为SQL语句,对于左表中的每一行,您都希望将其与右表中的值进行匹配。 因此,您将只扫描左侧表格一次,然后开始重新扫描右侧表格,直到左侧达到EoF。
with open(csvfile, newline='') as f_left:
reader_left = csv.reader(f_left, delimiter=',')
with open(csvfile, newline='') as f_right:
reader_right = csv.reader(f_right, delimiter=',')
for row in reader_left:
for compare_row in reader_right:
if row == compare_row:
print(row,'is equal to',compare_row)
else:
print(row,'is not equal to',compare_row)
f_right.seek(0)
尝试使用来自Python的内置包: Itertools
from itertools import product
with open("abcTest.txt") as inputFile:
aList = inputFile.read().split("\n")
aProduct = product(aList,aList)
for aElem,bElem in aProduct:
if aElem == bElem:
print aElem,'is equal to',bElem
else:
print aElem,'is not equal to',bElem
您面临的问题在Python中称为笛卡尔积,我们需要将数据行与其自身以及每隔一行进行比较。
为此,如果您要多次读取源文件,那么如果文件很大,则会导致明显的性能问题。 取而代之的是,您可以将数据存储在列表中,并在多个时间进行迭代,但这也将带来巨大的性能开销。
在这种情况下,itertool软件包非常有用,因为它针对此类问题进行了优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.