通过匹配两个 DF 中的 colC,将 colA 插入 DF1 中,其中包含来自 DF2['colB'] 的 val



我有两个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字段,使每个插入的Category与其正确的StockID相匹配。

注意1:CSV_A在StockID列上建立索引。CSV_B具有默认索引
注意2:CSV_B中的某些列(例如第3行(没有完整的信息。注3:添加列"类别";从CSV_ B转换成CSV_;Cat";在CSV_A 中

使用Series.map基于'StockID'映射'Category'

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'])))
^^^^^

在创建问题时,我发现了解决方案,因此决定发布它,而不是删除问题。

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

相关内容

最新更新