【问题标题】:Pandas: Merge (or inner join) two dataframes but keep columns from only onePandas:合并(或内部连接)两个数据框,但只保留一个数据框
【发布时间】:2018-01-18 00:49:05
【问题描述】:

我有两个 Pandas 数据框,并希望在一个键上将它们相交(也称为内部连接)。我了解 Pandas 数据框 merge() 的工作原理,但我遇到的问题是我想保留一个数据框的列,而不是两个数据框的列。

例如,假设我有以下两个数据框,df_usersdf_valid_users

df_users                     df_valid_users

user_id  email  dob          user_id last_login 
-------  -----  ---          ------- ----------
123      ...    ...          456     ...
456      ...    ...          710     ...
789      ...    ...

Desired result:

user_id  email  dob
-------  -----  ---
456      ...    ...

我想从df_users 获取所有列,只要df_users.user_id 也在df_valid_users 中。

我尝试使用pandas.merge(),但结果包含来自两个数据框的列。如何只保留左侧数据框中的列?我的真实数据有几十列,而不仅仅是本例中的几列。

import pandas as pd

rows_users = [ ['123', 'foo', '1970-01-01'],
               ['456', 'bar', '1980-01-01'],
               ['789', 'baz', '1990-01-01']]
df_users = pd.DataFrame(rows_users, columns=['user_id', 'email', 'dob'])
df_users
#   user_id email         dob
# 0     123   foo  1970-01-01
# 1     456   bar  1980-01-01
# 2     789   baz  1990-01-01

rows_valid_users = [ ['456', '2018-01-10'],
                     ['710', '1918-01-02']]
df_valid_users = pd.DataFrame(rows_valid_users, columns=['user_id', 'last_login'])
df_valid_users
#   user_id  last_login
# 0     456  2018-01-10
# 1     710  1918-01-02


pd.merge(df_users, df_valid_users, how='inner', on=['user_id'])
#   user_id email         dob  last_login
# 0     456   bar  1980-01-01  1918-01-02

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为你需要isin :-)

    df_users.loc[df_users['user_id'].isin(df_valid_users['user_id']),:]
    Out[37]: 
      user_id email         dob
    1     456   bar  1980-01-01
    

    【讨论】:

    • 谢谢。我猜isin() 函数必须在左侧数据帧的所有行上运行。这和拨打merge() 一样有效吗?通常内部连接是有效实现的(至少在 SQL 中是这样)。
    • @stackoverflowuser2010 根据我的经验,它应该很快,你可以在你身边测试这两种方法并检查时间:-)
    • @YOBEN_S - 我们如何使用loc 函数来组合两个字段,例如。 df_users.loc[df_users['email','dob'].isin(df_valid_users['email','dob']),:]?尝试过,但引发了关键错误。
    • @user12379095 stackoverflow.com/questions/48647534/…这可能会给你一些想法~方法1和方法2
    • @user12379095 df_users.loc[df_users[['email','dob']].apply(tuple,1).isin(df_valid_users[['email','dob']]].apply (元组,1)),:]
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2015-10-17
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多