我在 Python 中有一個資料框和一個字典,如下所示,我需要根據字典過濾資料框。如您所見,字典的鍵和值是資料框的兩列。我想要一個資料框子集,其中包含字典的鍵和值以及其他列。
df:
| 顧客ID | 類別 | 型別 | 送貨 |
|---|---|---|---|
| 40275 | 書 | 買 | 真的 |
| 40275 | 軟體 | 賣 | 錯誤的 |
| 40275 | 電子游戲 | 賣 | 錯誤的 |
| 40275 | 手機 | 賣 | 錯誤的 |
| 39900 | CD/DVD | 賣 | 真的 |
| 39900 | 書 | 買 | 真的 |
| 39900 | 軟體 | 賣 | 真的 |
| 35886 | 手機 | 賣 | 錯誤的 |
| 35886 | 電子游戲 | 買 | 錯誤的 |
| 35886 | CD/DVD | 賣 | 錯誤的 |
| 35886 | 軟體 | 賣 | 錯誤的 |
| 40350 | 軟體 | 賣 | 真的 |
| 28129 | 軟體 | 買 | 錯誤的 |
字典是:
d = {
40275: ['Book','Software'],
39900: ['Book'],
35886: ['Software'],
40350: ['Software'],
28129: ['Software']
}
我需要以下資料框:
| 顧客ID | 類別 | 型別 | 送貨 |
|---|---|---|---|
| 40275 | 書 | 買 | 真的 |
| 40275 | 軟體 | 賣 | 錯誤的 |
| 39900 | 書 | 買 | 真的 |
| 35886 | 軟體 | 賣 | 錯誤的 |
| 40350 | 軟體 | 賣 | 真的 |
| 28129 | 軟體 | 買 | 錯誤的 |
uj5u.com熱心網友回復:
展平字典并創建一個新的資料框,然后merge df將新的資料框放入內部
df.merge(pd.DataFrame([{'Customer_ID': k, 'Category': i}
for k, v in d.items() for i in v]))
Customer_ID Category Type Delivery
0 40275 Book Buy True
1 40275 Software Sell False
2 39900 Book Buy True
3 35886 Software Sell False
4 40350 Software Sell True
5 28129 Software Buy False
uj5u.com熱心網友回復:
我們可以set_index使用Customer_ID和Category列,然后從字典d和reindexDataFrame構建一個元組串列,只包含與元組串列匹配的行,然后reset_index恢復列:
new_df = df.set_index(['Customer_ID', 'Category']).reindex(
[(k, v) for k, lst in d.items() for v in lst]
).reset_index()
new_df:
Customer_ID Category Type Delivery
0 40275 Book Buy True
1 40275 Software Sell False
2 39900 Book Buy True
3 35886 Software Sell False
4 40350 Software Sell True
5 28129 Software Buy False
*請注意,這只適用于 MultiIndex 是唯一的(如所示示例)。如果字典不代表 DataFrame 的 MultiIndex 的子集(這可能是也可能不是所需的行為),它也會添加行。
設定:
import pandas as pd
d = {
40275: ['Book', 'Software'],
39900: ['Book'],
35886: ['Software'],
40350: ['Software'],
28129: ['Software']
}
df = pd.DataFrame({
'Customer_ID': [40275, 40275, 40275, 40275, 39900, 39900, 39900, 35886,
35886, 35886, 35886, 40350, 28129],
'Category': ['Book', 'Software', 'Video Game', 'Cell Phone', 'CD/DVD',
'Book', 'Software', 'Cell Phone', 'Video Game', 'CD/DVD',
'Software', 'Software', 'Software'],
'Type': ['Buy', 'Sell', 'Sell', 'Sell', 'Sell', 'Buy', 'Sell', 'Sell',
'Buy', 'Sell', 'Sell', 'Sell', 'Buy'],
'Delivery': [True, False, False, False, True, True, True, False, False,
False, False, True, False]
})
uj5u.com熱心網友回復:
你可以用df.merge與df.append:
In [444]: df1 = pd.DataFrame.from_dict(d, orient='index', columns=['Cat1', 'Cat2']).reset_index()
In [449]: res = df.merge(df1[['index', 'Cat1']], left_on=['Customer_ID', 'Category'], right_on=['index', 'Cat1']).drop(['index', 'Cat1'], 1)
In [462]: res = res.append(df.merge(df1[['index', 'Cat2']], left_on=['Customer_ID', 'Category'], right_on=['index', 'Cat2']).drop(['index', 'Cat2'], 1)).sort_values('Customer_ID', ascending=False)
In [463]: res
Out[463]:
Customer_ID Category Type Delivery
3 40350 Software Sell True
0 40275 Book Buy True
0 40275 Software Sell False
1 39900 Book Buy True
2 35886 Software Sell False
4 28129 Software Buy False
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358194.html
