【问题标题】:Finding intersection between two dataframes iteratively迭代地查找两个数据帧之间的交集
【发布时间】:2022-01-06 09:44:57
【问题描述】:

我有以下两个数据框,想找到它们的交集。

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]

到目前为止,我所阅读的内容与查找单个列表的交集有关,而不是针对具有不同数据类型的两个数据框。我的最终目标是计算 precisionintersection of df1 and df2 divide by the total number of my recommendations from df1 ,即 3。 以下来自 cmets 的补充说明: 这些行是对齐的,并将成对比较。 df3 中的[0] 不会出现在任何地方,但可以在交点为 0 的情况下工作。

【问题讨论】:

  • 两个数据帧之间的行是否对齐?比较 0 -> 0、1 -> 1 等?
  • 为什么[0]df3 中? df1 中没有出现零。
  • 是的,行已对齐。没错,我想逐行比较。
  • True @hilberts_drinking_problem 我在那里加了零,如果交集是 0,它肯定可以用其他替代品来表示
  • @SquidGame 我认为空列表[] 更适合这个例子。

标签: python pandas list dataframe intersection


【解决方案1】:

给定

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]

【讨论】:

    【解决方案2】:
    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]]
    

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2018-02-08
      • 2021-03-18
      • 2013-08-06
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多