Python 中表的成对行匹配
Pairwise row match of tables in Python
我正在尝试对 100 多个表进行成对比较,以找到 "ID" 共有的行。
有没有一种简单的方法可以在不经过很多循环的情况下进行这种成对比较?
预期输出是 matrix/heatmap 显示表之间的相似性,表之间的行数相同。
附上我的表格样本。它们都保存在我机器的同一个目录中。
谢谢,
你可以在这种情况下使用 numpy
我假设所有数据都是这样的数据框:
id1 = ['A','B','C','D','E','F','G','H','I']
Value1 = np.random.random((len(id1),))
data1 = pd.DataFrame({'ID':id1,'Value':Value1})
id2 = ['O','P','A','C','R','T','U','L','M','B','E']
Value2 = np.random.random((len(id2),))
data2 = pd.DataFrame({'ID':id2,'Value':Value2})
我们将从 data1 中获取值,使用 numpy.in1d,如下所示:
result1 = data1[np.in1d(data1['ID'],data2['ID'])]
或者我们将从 data2 中获取值,如下所示:
result2 = data2[np.in1d(data2['ID'],data1['ID'])]
结果:
>>> result1
ID Value
0 A 0.213569
1 B 0.483985
2 C 0.888146
4 E 0.812130
>>> result2
ID Value
2 A 0.875728
3 C 0.690587
9 B 0.793642
10 E 0.679874
>>>
如果我理解正确,您只需要 ID 列的成对相似性,而不管 Value 列是否具有该 ID 的不同值。假设您的表表示为名为 'dfs':
的数据框列表
m = np.zeros(shape=(len(dataframes), len(dataframes)))
for i, d in enumerate(dataframes):
for j, d_ in enumerate(dataframes):
commons = len(set(d.ID).intersection(set(d_.ID)))
m[i][j] = commons
df = pd.DataFrame(m).applymap(int)
print(df)
我正在尝试对 100 多个表进行成对比较,以找到 "ID" 共有的行。 有没有一种简单的方法可以在不经过很多循环的情况下进行这种成对比较?
预期输出是 matrix/heatmap 显示表之间的相似性,表之间的行数相同。
附上我的表格样本。它们都保存在我机器的同一个目录中。
谢谢,
你可以在这种情况下使用 numpy 我假设所有数据都是这样的数据框:
id1 = ['A','B','C','D','E','F','G','H','I']
Value1 = np.random.random((len(id1),))
data1 = pd.DataFrame({'ID':id1,'Value':Value1})
id2 = ['O','P','A','C','R','T','U','L','M','B','E']
Value2 = np.random.random((len(id2),))
data2 = pd.DataFrame({'ID':id2,'Value':Value2})
我们将从 data1 中获取值,使用 numpy.in1d,如下所示:
result1 = data1[np.in1d(data1['ID'],data2['ID'])]
或者我们将从 data2 中获取值,如下所示:
result2 = data2[np.in1d(data2['ID'],data1['ID'])]
结果:
>>> result1
ID Value
0 A 0.213569
1 B 0.483985
2 C 0.888146
4 E 0.812130
>>> result2
ID Value
2 A 0.875728
3 C 0.690587
9 B 0.793642
10 E 0.679874
>>>
如果我理解正确,您只需要 ID 列的成对相似性,而不管 Value 列是否具有该 ID 的不同值。假设您的表表示为名为 'dfs':
的数据框列表m = np.zeros(shape=(len(dataframes), len(dataframes)))
for i, d in enumerate(dataframes):
for j, d_ in enumerate(dataframes):
commons = len(set(d.ID).intersection(set(d_.ID)))
m[i][j] = commons
df = pd.DataFrame(m).applymap(int)
print(df)