在多个数据帧中按相同顺序查找行
Find row by same sequence among multiple dataframes
我想按列在多个 pandas 数据帧中找到相同的序列及其行。
例如,在column3中找到它们。
Table一个
column1, column2, column3
1, a, p1
2, c, p3
3, d, P4
4, b, p2
Table B
column1, column2, column3
1, x, p20
2, x, p20
3, y, p3
4, z, P4
5, w, p7
您可以看到 P3 和 P4 在两个表中的排列相同。我想分别识别和 select 它们的行。请考虑我有 100 多个表,它必须可用于两个以上。
有人可以帮助我吗?谢谢!
这里有一些代码可以满足您的需求。在本例中,我生成了包含 100 个条目的 40 个随机列并搜索序列匹配项。由于 pandas 迭代非常慢,您可能希望将每个表中的最后一列拉出到一个单独的列表列表中。
import numpy as np
def findall(row, value):
for i,v in enumerate(row):
if v == value:
yield i
table_list = list( np.random.randint(0,25,size=100) for _ in range(40))
# For each table in the list:
for idxA, tblA in enumerate(table_list):
# For each remaining table:
for idxB, tblB in enumerate(table_list[idxA+1:]):
# For each starting point in the first table:
for a0 in range(len(tblA)-1):
# Search for that value.
for b0 in findall( tblB, tblA[a0] ):
match = 1
# Count how long the match is.
a99 = len(tblA) - a0
b99 = len(tblB) - b0
for dx in range(min(a99,b99)):
if tblA[a0+dx] != tblB[b0+dx]:
break
match += 1
if match > 2:
print( f"Sequence of {match} at table {idxA} row {a0} and table {idxB+idaX+1} row {b0}" )
我想按列在多个 pandas 数据帧中找到相同的序列及其行。
例如,在column3中找到它们。
Table一个
column1, column2, column3
1, a, p1
2, c, p3
3, d, P4
4, b, p2
Table B
column1, column2, column3
1, x, p20
2, x, p20
3, y, p3
4, z, P4
5, w, p7
您可以看到 P3 和 P4 在两个表中的排列相同。我想分别识别和 select 它们的行。请考虑我有 100 多个表,它必须可用于两个以上。
有人可以帮助我吗?谢谢!
这里有一些代码可以满足您的需求。在本例中,我生成了包含 100 个条目的 40 个随机列并搜索序列匹配项。由于 pandas 迭代非常慢,您可能希望将每个表中的最后一列拉出到一个单独的列表列表中。
import numpy as np
def findall(row, value):
for i,v in enumerate(row):
if v == value:
yield i
table_list = list( np.random.randint(0,25,size=100) for _ in range(40))
# For each table in the list:
for idxA, tblA in enumerate(table_list):
# For each remaining table:
for idxB, tblB in enumerate(table_list[idxA+1:]):
# For each starting point in the first table:
for a0 in range(len(tblA)-1):
# Search for that value.
for b0 in findall( tblB, tblA[a0] ):
match = 1
# Count how long the match is.
a99 = len(tblA) - a0
b99 = len(tblB) - b0
for dx in range(min(a99,b99)):
if tblA[a0+dx] != tblB[b0+dx]:
break
match += 1
if match > 2:
print( f"Sequence of {match} at table {idxA} row {a0} and table {idxB+idaX+1} row {b0}" )