迭代查找两个数据帧之间的交集
Finding intersection between two dataframes iteratively
我有以下两个数据框,想找到它们的交集。
df1 = pd.DataFrame({"0": [1524, 8788, 9899, 27172],
"1": [1333, 4476, 78783, 90832],
"2": [2021, 2022, 34522, 38479]})
print(df1)
0 1 2
0 1524 1333 2021
1 8788 4476 2022
2 9899 78783 34522
3 27172 90832 38479
df2
是一个包含一列“0”的列表类型,如下所示:
0
[1123, 2021, 1333, 6636],
[1245, 2022, 4477, 0],
[1524, 2023, 1, 27172],
[2021, 2023, 90832, 38479]
预期输出应该是 df1 和 df2 的交集,例如:
df3 = [2021, 1333],
[2022],
[0],
[90832, 38479]
到目前为止,我读到的内容与查找单个列表的交集有关,而不是两个具有不同数据类型的数据帧。我的最终目标是计算 precision 即 intersection of df1 and df2 divide by the total number of my recommendations from df1
,即 3。
来自以下评论的补充说明:
行对齐并且将成对比较。
[0]
在 df3 中没有出现在任何地方,但在交集为 0 的情况下可以工作。
给出
df1
:
0 1 2
0 1524 1333 2021
1 8788 4476 2022
2 9899 78783 34522
3 27172 90832 38479
和df2
:
0
0 [1123, 2021, 1333, 6636]
1 [1245, 2022, 4477, 0]
2 [1524, 2023, 1, 27172]
3 [2021, 2023, 90832, 38479]
您可以在列表理解中使用 set.intersection
:
df1_lst = df1.to_numpy().tolist()
df2_lst = df2.to_numpy().tolist()
df3 = pd.DataFrame([[list(set(i).intersection(j[0]))] for i,j in zip(df1_lst, df2_lst)], columns=['col'])
输出:
col
0 [1333, 2021]
1 [2022]
2 []
3 [90832, 38479]
lst=[[1123, 2021, 1333, 6636],
[1245, 2022, 4477, 0],
[1524, 2023, 1, 27172],
[2021, 2023, 90832, 38479]]
s=[set(x)for x in lst]#put list in set
s1=df1.agg(set,1).to_list()#make list of list of row values
[list(x.intersection(y)) for x, y in zip(s, s1)]
出来
[[1333, 2021], [2022], [], [90832, 38479]]
我有以下两个数据框,想找到它们的交集。
df1 = pd.DataFrame({"0": [1524, 8788, 9899, 27172],
"1": [1333, 4476, 78783, 90832],
"2": [2021, 2022, 34522, 38479]})
print(df1)
0 1 2
0 1524 1333 2021
1 8788 4476 2022
2 9899 78783 34522
3 27172 90832 38479
df2
是一个包含一列“0”的列表类型,如下所示:
0
[1123, 2021, 1333, 6636],
[1245, 2022, 4477, 0],
[1524, 2023, 1, 27172],
[2021, 2023, 90832, 38479]
预期输出应该是 df1 和 df2 的交集,例如:
df3 = [2021, 1333],
[2022],
[0],
[90832, 38479]
到目前为止,我读到的内容与查找单个列表的交集有关,而不是两个具有不同数据类型的数据帧。我的最终目标是计算 precision 即 intersection of df1 and df2 divide by the total number of my recommendations from df1
,即 3。
来自以下评论的补充说明:
行对齐并且将成对比较。
[0]
在 df3 中没有出现在任何地方,但在交集为 0 的情况下可以工作。
给出
df1
:
0 1 2
0 1524 1333 2021
1 8788 4476 2022
2 9899 78783 34522
3 27172 90832 38479
和df2
:
0
0 [1123, 2021, 1333, 6636]
1 [1245, 2022, 4477, 0]
2 [1524, 2023, 1, 27172]
3 [2021, 2023, 90832, 38479]
您可以在列表理解中使用 set.intersection
:
df1_lst = df1.to_numpy().tolist()
df2_lst = df2.to_numpy().tolist()
df3 = pd.DataFrame([[list(set(i).intersection(j[0]))] for i,j in zip(df1_lst, df2_lst)], columns=['col'])
输出:
col
0 [1333, 2021]
1 [2022]
2 []
3 [90832, 38479]
lst=[[1123, 2021, 1333, 6636],
[1245, 2022, 4477, 0],
[1524, 2023, 1, 27172],
[2021, 2023, 90832, 38479]]
s=[set(x)for x in lst]#put list in set
s1=df1.agg(set,1).to_list()#make list of list of row values
[list(x.intersection(y)) for x, y in zip(s, s1)]
出来
[[1333, 2021], [2022], [], [90832, 38479]]