考虑一下这个df 'A':
name index pet
0 Alice 2 dog
1 Bob 5 cat
2 Chuck 12 cat
3 Daren 4 bird
4 Emily 9 bird然后这个df 'B':
pet
0 dog
1 cat
2 dog
3 bird
4 cat
5 cat
6 bird
7 cat
8 bird
9 bird
...如果“A”中列“index”中的值和列“宠物”中的值与dataset ' B‘中的实际索引以及dataset B中列'pet’中的值相匹配,则保留这些值,并过滤掉其余的值。
结果的dataframe应该如下所示:
pet
2 dog
5 cat
9 bird
...做这件事最有效的方法是什么?任何帮助都是非常感谢的。
数据:
dfA
{'name': ['Alice', 'Bob', 'Chuck', 'Daren', 'Emily'],
'index': [2, 5, 12, 4, 9],
'pet': ['dog', 'cat', 'cat', 'bird', 'bird']}dfB
{'pet': ['dog', 'cat', 'dog', 'bird', 'cat', 'cat', 'bird', 'cat', 'bird', 'bird']}发布于 2022-02-27 19:16:34
你可以做个合并。
import pandas as pd
dfa = pd.DataFrame({'name': {0: 'Alice', 1: 'Bob', 2: 'Chuck', 3: 'Daren', 4: 'Emily'},
'index': {0: 2, 1: 5, 2: 12, 3: 4, 4: 9},
'pet': {0: 'dog', 1: 'cat', 2: 'cat', 3: 'bird', 4: 'bird'}})
dfb = pd.DataFrame({'pet': {0: 'dog',
1: 'cat',
2: 'dog',
3: 'bird',
4: 'cat',
5: 'cat',
6: 'bird',
7: 'cat',
8: 'bird',
9: 'bird'}})
dfm = pd.merge(dfa, dfb, left_on=['index', 'pet'], right_on=[dfb.index, 'pet'])
dfm = dfm[['index', 'pet']].set_index('index', drop=True)输出:
pet
index
2 dog
5 cat
9 bird发布于 2022-02-27 19:08:41
一种选择是使用reindex dfB和dfA['index']计算“宠物”值匹配的位置:
tmp = dfB.reindex(dfA['index'])
out = tmp[tmp['pet'].eq(dfA.set_index('index')['pet'])].rename_axis([None])另一个选项是map dfB.index在dfA中“宠物”列,并创建一个显示“宠物”列匹配位置的布尔掩码;然后筛选dfB。
out = dfB[dfB.index.map(dfA.set_index('index')['pet']) == dfB['pet']]输出:
pet
2 dog
5 cat
9 bird发布于 2022-02-27 19:44:28
下面是一种将to_records()与isin()结合使用的方法
(df2.loc[pd.Series(df2.reset_index()
.to_records(index=False)
.tolist())
.isin(df1[['index','pet']]
.to_records(index=False)
.tolist())])输出:
pet
2 dog
5 cat
9 birdhttps://stackoverflow.com/questions/71287652
复制相似问题