当前位置: 首页 > 知识库问答 >
问题:

在两个数据帧中查找公共行(交点)

陈阳舒
2023-03-14

假设我有两个这种格式的数据帧(称它们为df1df2):

+------------------------+------------------------+--------+
|        user_id         |      business_id       | rating |
+------------------------+------------------------+--------+
| rLtl8ZkDX5vH5nAx9C3q5Q | eIxSLxzIlfExI6vgAbn2JA |      4 |
| C6IOtaaYdLIT5fWd7ZYIuA | eIxSLxzIlfExI6vgAbn2JA |      5 |
| mlBC3pN9GXlUUfQi1qBBZA | KoIRdcIfh3XWxiCeV1BDmA |      3 |
+------------------------+------------------------+--------+

我希望获得所有行的数据帧,这些行在df1df2中有一个公共的user\u id。(即,如果用户id同时位于df1df2中,则在输出数据帧中包括这两行)

我能想到很多方法来解决这个问题,但它们都让我觉得笨拙。例如,我们可以在每个数据帧中找到所有唯一的user_ids,创建每个数据帧的集合,找到它们的交集,用结果集过滤两个数据帧,并连接两个过滤后的数据帧。

也许这是最好的方法,但我知道熊猫很聪明。有没有更简单的方法?我已经看过了merge,但我认为这不是我需要的。

共有3个答案

鲁靖
2023-03-14

在SQL中,此问题可以通过以下几种方法解决:

select * from df1 where exists (select * from df2 where df2.user_id = df1.user_id)
union all
select * from df2 where exists (select * from df1 where df1.user_id = df2.user_id)

或加入,然后取消枢轴(可能在SQL服务器)

select
    df1.user_id,
    c.rating
from df1
    inner join df2 on df2.user_i = df1.user_id
    outer apply (
        select df1.rating union all
        select df2.rating
    ) as c

第二张可以用熊猫写,上面写着:

>>> df1 = pd.DataFrame({"user_id":[1,2,3], "rating":[10, 15, 20]})
>>> df2 = pd.DataFrame({"user_id":[3,4,5], "rating":[30, 35, 40]})
>>>
>>> df4 = df[['user_id', 'rating_1']].rename(columns={'rating_1':'rating'})
>>> df = pd.merge(df1, df2, on='user_id', suffixes=['_1', '_2'])
>>> df3 = df[['user_id', 'rating_1']].rename(columns={'rating_1':'rating'})
>>> df4 = df[['user_id', 'rating_2']].rename(columns={'rating_2':'rating'})
>>> pd.concat([df3, df4], axis=0)
   user_id  rating
0        3      20
0        3      30
刁英朗
2023-03-14

如果我理解正确,您可以结合使用Series.isin()DataFrame.append()

In [80]: df1
Out[80]:
   rating  user_id
0       2  0x21abL
1       1  0x21abL
2       1   0xdafL
3       0  0x21abL
4       4  0x1d14L
5       2  0x21abL
6       1  0x21abL
7       0   0xdafL
8       4  0x1d14L
9       1  0x21abL

In [81]: df2
Out[81]:
   rating      user_id
0       2      0x1d14L
1       1    0xdbdcad7
2       1      0x21abL
3       3      0x21abL
4       3      0x21abL
5       1  0x5734a81e2
6       2      0x1d14L
7       0       0xdafL
8       0      0x1d14L
9       4  0x5734a81e2

In [82]: ind = df2.user_id.isin(df1.user_id) & df1.user_id.isin(df2.user_id)

In [83]: ind
Out[83]:
0     True
1    False
2     True
3     True
4     True
5    False
6     True
7     True
8     True
9    False
Name: user_id, dtype: bool

In [84]: df1[ind].append(df2[ind])
Out[84]:
   rating  user_id
0       2  0x21abL
2       1   0xdafL
3       0  0x21abL
4       4  0x1d14L
6       1  0x21abL
7       0   0xdafL
8       4  0x1d14L
0       2  0x1d14L
2       1  0x21abL
3       3  0x21abL
4       3  0x21abL
6       2  0x1d14L
7       0   0xdafL
8       0  0x1d14L

这本质上就是您描述为“笨重”的算法,使用惯用的pandas方法。请注意重复的行索引。另外,请注意,如果df1df2没有重叠的行索引,即如果

In [93]: df1.index & df2.index
Out[93]: Int64Index([], dtype='int64')

事实上,如果它们的行索引不相等,它就不会给出预期的输出。

景俊语
2023-03-14

我的理解是,这个问题最好在这篇文章中回答。

但简单地说,使用这种方法的OP的答案很简单:

s1 = pd.merge(df1, df2, how='inner', on=['user_id'])

这给s1提供了5列:user_id和来自df1和df2的另外两列。

 类似资料:
  • 问题内容: 假设我有两个这种格式的数据框(分别称为和): 我正在寻找在和中具有共同点的所有行的数据框。(即,如果是在两个和,在输出中包括数据帧的两行) 我可以想到很多方法来解决这个问题,但是它们都使我感到笨拙。例如,我们可以在每个数据帧中找到所有唯一的,创建每个的唯一集合,找到它们的交集,使用结果集过滤两个数据帧,然后将两个过滤后的数据帧连接起来。 也许这是最好的方法,但是我知道熊猫很聪明。有没有

  • 本文向大家介绍在C ++中的两个双链表中查找公共节点数,包括了在C ++中的两个双链表中查找公共节点数的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个双向链表。我们必须在两个双向链表中都找到公共节点的总数。因此,如果两个列表像[15、16、10、9、7、17]和[15、16、40、6、9],则有三个公共节点。 使用两个嵌套循环遍历两个列表,直到列表的末尾,对于列表中的每个节点,检查它是否与

  • 我试图在我的ArrayList“list1”中找到公共元素 它包含“dateFrom”和“dateTo”之间的所有日期以及我的列表“list2” 其中dateTime是一个变量,它仅存储具有以下结构的文本文件中的日期: 我尝试使用来查找清单2中也在清单1中的所有日期,但我认为我的问题是清单2不是一个ArrayList。我该怎么解决呢?

  • 代码不止一次返回0和公共数字。我想让它返回一个数组与公共数字一次!那么,如何返回一个数组,数组中的数字对两个数组都是通用的。我想返回{2,7,4}-类似这样的东西。当我试图返回数组时,我总是出现越界异常。谢谢,巴里

  • 我有两个Pandas Dataframe和,其中是的一部分,我想创建一个Dataframe,其中包含中的code>。 以下是一个例子: 注: 我的DataFrame可能有多个列,但是必须仅在列上进行匹配。

  • 我有两个数据帧df1和df2,其中df2是df1的子集。我如何获得一个新的数据帧(df3),它是两个数据帧之间的差值? 换句话说,一个数据帧,它包含了df1中所有的行/列,而不是DF2中的行/列?