我有兩個 CSV 檔案,CSV_A 和 CSV_B.csv。我必須將列(類別)從 CSV_B 插入 CSV_A。
這兩個 CSV 共享一個公共列:StockID,我必須通過匹配 StockID 列將正確的類別添加到每一行。
這可以使用合并來完成,如下所示:
dfa.merge(dfb, how='left', on='StockID')
但我只想添加一列,而不是加入兩個資料框。
CSV_A(在 StockID 上索引):
StockID,Brand,ToolName,Price
ABC123,Maxwell,ToolA,1.25
BCD234,Charton,ToolB,2.22
CDE345,Bingley,ToolC,3.33
DEF789,Charton,ToolD,1.44
CSV_B:
PurchDate,Supplier,StockID,Category
20201005,Sigmat,BCD234,CatShop
20210219,Zorbak,AAA111,CatWares
20210307,Phillips
20210417,Tandey,CDE345,CatThings
20210422,Stapek,BBB222,CatElse
20210502,Zorbak,ABC123,CatThis
20210512,Zorbak,CCC999,CatThings
20210717,Phillips,DEF789,CatShop
我的任務是在 CSV_A 中插入一個Cat欄位,將每個插入的類別與其正確的 StockID 匹配。
注意 1: CSV_A 在 StockID 列上編入索引。CSV_B 具有默認索引。
注意2: CSV_B 中的某些列(例如第 3 行)沒有完整的資訊。
注 3:將 CSV_B 中的“類別”列添加到 CSV_A 中,但在 CSV_A 中將其稱為“Cat”
uj5u.com熱心網友回復:
使用基于Series.map映射'Category''StockID'
df_a['Cat'] = df_a['StockID'].map(dict(zip(df_b['StockID'], df_b['Category'])))
請注意,對于這個特定問題(即在 StockID 上索引 CSV_A),代碼必須是:
df_a['Cat'] = df_a.index.map(dict(zip(df_b['StockID'], df_b['Category'])))
^^^^^
uj5u.com熱心網友回復:
在創建問題時,我發現了解決方案,因此決定發布它而不僅僅是洗掉問題。
import pandas as pd
dfa = pd.read_csv('csv_a.csv')
dfa.set_index('StockID', inplace=True)
dfb = pd.read_csv('csv_b.csv')
#remove incomplete rows (i.e. without Category/StockID columns)
dfb_tmp = dfb[dfb['StockID'].notnull()]
def myfunc(row):
# NB: Use row.name because row['StockID'] is the index
if row.name in list(dfb_tmp['StockID']):
return dfb_tmp.loc[dfb_tmp['StockID'] == row.name]['Category'].values[0]
dfa['Cat'] = dfa.apply(lambda row: myfunc(row), axis=1)
print(dfa)
結果:
StockID Brand ToolName Price Cat
ABC123 Maxwell ToolA 1.25 CatThis
BCD234 Charton ToolB 2.22 CatShop
CDE345 Bingley ToolC 3.33 CatThings
DEF789 Charton ToolD 1.44 CatShop
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/429575.html
上一篇:計算多列中值的所有組合
