考慮這個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'列的值和'pet'列的值與資料集'B'的實際索引以及資料集B的'pet'列的值匹配,則保留這些值,并過濾掉其他的。
生成的資料框應如下所示:
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']}
uj5u.com熱心網友回復:
你可以做一個合并。
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
uj5u.com熱心網友回復:
一種選擇是reindex dfB使用dfA['index']并評估“寵物”值匹配的位置:
tmp = dfB.reindex(dfA['index'])
out = tmp[tmp['pet'].eq(dfA.set_index('index')['pet'])].rename_axis([None])
另一個選項是mapdfB.index 到“pet”列dfA并創建一個布爾掩碼,顯示“pet”列匹配的位置;然后過濾dfB:
out = dfB[dfB.index.map(dfA.set_index('index')['pet']) == dfB['pet']]
輸出:
pet
2 dog
5 cat
9 bird
uj5u.com熱心網友回復:
這是一種使用to_records()withisin()
(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 bird
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433530.html
