首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从另一个数据集的多列筛选数据集

从另一个数据集的多列筛选数据集
EN

Stack Overflow用户
提问于 2022-02-27 18:59:47
回答 3查看 92关注 0票数 1

考虑一下这个df 'A':

代码语言:javascript
运行
复制
     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':

代码语言:javascript
运行
复制
    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应该如下所示:

代码语言:javascript
运行
复制
    pet
2   dog
5   cat
9  bird
...

做这件事最有效的方法是什么?任何帮助都是非常感谢的。

数据:

dfA

代码语言:javascript
运行
复制
{'name': ['Alice', 'Bob', 'Chuck', 'Daren', 'Emily'],
 'index': [2, 5, 12, 4, 9],
 'pet': ['dog', 'cat', 'cat', 'bird', 'bird']}

dfB

代码语言:javascript
运行
复制
{'pet': ['dog', 'cat', 'dog', 'bird', 'cat', 'cat', 'bird', 'cat', 'bird', 'bird']}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-27 19:16:34

你可以做个合并。

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
    pet
index   
2   dog
5   cat
9   bird
票数 2
EN

Stack Overflow用户

发布于 2022-02-27 19:08:41

一种选择是使用reindex dfBdfA['index']计算“宠物”值匹配的位置:

代码语言:javascript
运行
复制
tmp = dfB.reindex(dfA['index'])
out = tmp[tmp['pet'].eq(dfA.set_index('index')['pet'])].rename_axis([None])

另一个选项是map dfB.index在dfA中“宠物”列,并创建一个显示“宠物”列匹配位置的布尔掩码;然后筛选dfB

代码语言:javascript
运行
复制
out = dfB[dfB.index.map(dfA.set_index('index')['pet']) == dfB['pet']]

输出:

代码语言:javascript
运行
复制
    pet
2   dog
5   cat
9  bird
票数 2
EN

Stack Overflow用户

发布于 2022-02-27 19:44:28

下面是一种将to_records()isin()结合使用的方法

代码语言:javascript
运行
复制
(df2.loc[pd.Series(df2.reset_index()
                   .to_records(index=False)
                   .tolist())
         .isin(df1[['index','pet']]
               .to_records(index=False)
               .tolist())])

输出:

代码语言:javascript
运行
复制
    pet
2   dog
5   cat
9  bird
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71287652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档