Python 熊猫:当一个列值与另一个DF的列值匹配时,提取DF的行

Python 熊猫:当一个列值与另一个DF的列值匹配时,提取DF的行,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个DF1和DF2,如下所述。两个数据帧的第一列“POS”可能匹配,但其他列将不同。我想比较两个数据帧的'POS'列,如果DF1的'POS'值在DF2'POS'列中,我想将该行存储在新的DF1数据帧中,并对DF2执行相同的操作。我可以很容易地使用字典,将POS作为键,比较它们以获得相应的值。但是字典不会接受重复的“POS”值,所以我想知道是否有一个解决方案 df1 = POS id freq 0 100 "idex" 3.0 1 102 "ter" 2.0 2 102 "p

我有两个DF1和DF2,如下所述。两个数据帧的第一列“POS”可能匹配,但其他列将不同。我想比较两个数据帧的'POS'列,如果DF1的'POS'值在DF2'POS'列中,我想将该行存储在新的DF1数据帧中,并对DF2执行相同的操作。我可以很容易地使用字典,将POS作为键,比较它们以获得相应的值。但是字典不会接受重复的“POS”值,所以我想知道是否有一个解决方案

df1 = 
   POS   id    freq
0 100 "idex" 3.0
1 102 "ter" 2.0
2 102 "pec" 4.0
3 103 "jek" 4.0
4 104 "jek" 4.0


df2 = 
   POS   id    freq
0 100 "treg" 3.0
1 102 "dfet" 2.2
2 102 "idet" 7.0
3 108 "jeik" 1.0
4 109 "jek" 4.0

Expected:
new_df1 = 
   POS   id    freq
0 100 "idex" 3.0
1 102 "ter" 2.0
2 102 "pec" 4.0


new_df2 = 
   POS   id    freq
0 100 "treg" 3.0
1 102 "dfet" 2.2
2 102 "idet" 7.0

您可以对两个数据帧使用
isin

new_df1 = df1[df1.POS.isin(df2.POS)]

new_df2 = df2[df2.POS.isin(df1.POS)]

>>> new_df1
   POS    id  freq
0  100  idex   3.0
1  102   ter   2.0
2  102   pec   4.0
>>> new_df2
   POS    id  freq
0  100  treg   3.0
1  102  dfet   2.2
2  102  idet   7.0

您可以对两个数据帧使用
isin

new_df1 = df1[df1.POS.isin(df2.POS)]

new_df2 = df2[df2.POS.isin(df1.POS)]

>>> new_df1
   POS    id  freq
0  100  idex   3.0
1  102   ter   2.0
2  102   pec   4.0
>>> new_df2
   POS    id  freq
0  100  treg   3.0
1  102  dfet   2.2
2  102  idet   7.0

我相信您描述的是一个典型的连接问题。 我建议使用
.merge()
方法:

df=pd.merge(df1,df2,how='left',on='POS')


这将返回一个以df1.POS作为索引的新数据帧。df2中的所有列都将在df1中,但仅适用于匹配的POS值。您可以使用
how=
参数来获得所需的内容。有关更多信息,请参见

我相信您描述的是一个典型的连接问题。 我建议使用
.merge()
方法:

df=pd.merge(df1,df2,how='left',on='POS')


这将返回一个以df1.POS作为索引的新数据帧。df2中的所有列都将在df1中,但仅适用于匹配的POS值。您可以使用
how=
参数来获得所需的内容。有关更多信息,请参见

能否更好地使这些帧复制可复制?完整列表或粘贴
df.head()
的输出,而不是两者都粘贴。对此表示抱歉。非常感谢您修复它们@saculIt听起来您希望在一个条件下加入(df1.POS==df2.POS),并保留第一个数据帧,然后对第二个数据帧执行相同的操作。这就是它的范围吗?你能不能把这些框架复制得更容易些?完整列表或粘贴
df.head()
的输出,而不是两者都粘贴。对此表示抱歉。非常感谢您修复它们@saculIt听起来您希望在一个条件下加入(df1.POS==df2.POS),并保留第一个数据帧,然后对第二个数据帧执行相同的操作。这就是问题的范围吗?