Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:合并(或内部连接)两个数据帧,但只保留一个数据帧中的列_Python_Pandas - Fatal编程技术网

Python 熊猫:合并(或内部连接)两个数据帧,但只保留一个数据帧中的列

Python 熊猫:合并(或内部连接)两个数据帧,但只保留一个数据帧中的列,python,pandas,Python,Pandas,我有两个熊猫数据帧,希望在一个关键点上相交(也称为内部连接)。我了解Pandas dataframemerge()的工作原理,但我遇到的问题是我希望保留一个数据帧中的列,而不是两个数据帧中的列 例如,假设我有以下两个数据帧,df\u用户和df\u有效用户 df_users df_valid_users user_id email dob user_id last_login ------- ----- ---

我有两个熊猫数据帧,希望在一个关键点上相交(也称为内部连接)。我了解Pandas dataframe
merge()
的工作原理,但我遇到的问题是我希望保留一个数据帧中的列,而不是两个数据帧中的列

例如,假设我有以下两个数据帧,
df\u用户
df\u有效用户

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\u用户
中获取所有列,只要
df\u用户。用户id
也在
df\u有效用户

我尝试使用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

任何帮助都将不胜感激。

我想您需要
isin
:-)


非常感谢。我猜
isin()
函数必须在左侧数据帧的所有行上运行。这和调用
merge()
一样有效吗?通常内部连接是有效实现的(至少在SQL中是如此)。@stackoverflowuser2010根据我的经验,它应该很快,你可以在你这边测试这两种方法并检查时间:-)@YOBEN_S-我们如何将
loc
函数用于两个字段的组合,例如
df_users.loc[df_users['email','dob'].isin(df_valid_users['email','dob'],:]
?已尝试,但出现关键错误。@user12379095这可能会让您了解方法1和方法22@user12379095df_users.loc[df_users[['email','dob']].apply(元组,1).isin(df_有效_users[['email','dob']].apply(元组,1)),:]
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