3 回答

TA貢獻1744條經(jīng)驗 獲得超4個贊
這是我將如何解決這個問題:
# First we make two dataframes out of the dictionaries with pd.melt
df2 = pd.DataFrame(prod_dict, index=[0])
df3 = pd.DataFrame(pack_dict, index=[0])
df2 = df2.melt(var_name=['PROD_TYPE'], value_name = 'ITEM')
df3 = df3.melt(var_name=['PKG_TYPE'], value_name = 'ITEM')
# df2
PROD_TYPE ITEM
0 PK Packaging
1 ML Mix
2 CM Textile
3 NK Metallic
# df3
PKG_TYPE ITEM
0 PK3 Misc Packaging
1 PK4 Mix Packaging
2 PK9 Textile Packaging
# Now we can merge our information together on keycolumns PROD_TYPE and PKG_TYPE
df_final = pd.merge(df, df2, on='PROD_TYPE')
df_final = pd.merge(df_final, df3, on='PKG_TYPE')
PROD_TYPE PKG_TYPE VALUE ITEM_x ITEM_y
0 PK PK3 1000 Packaging Misc Packaging
1 ML PK4 900 Mix Mix Packaging
2 ML PK4 800 Mix Mix Packaging
3 CM PK9 700 Textile Textile Packaging
# Finally we use np.where to conditionally select the values we need
df_final['ITEM'] = np.where(df_final.PROD_TYPE == 'PK', df_final.ITEM_y, df_final.ITEM_x)
# Drop columns which are not needed in output
df_final.drop(['ITEM_x', 'ITEM_y'], axis=1, inplace=True)
輸出
PROD_TYPE PKG_TYPE VALUE ITEM
0 PK PK3 1000 Misc Packaging
1 ML PK4 900 Mix
2 ML PK4 800 Mix
3 CM PK9 700 Textile
np.where來自numpy模塊,工作原理如下:
np.where(condition, true value, false value)

TA貢獻1829條經(jīng)驗 獲得超13個贊
類似于@Erfan 的回答,使用numpy.where但跳過meltto use pd.Series.map()。使用問題中的變量:
In []: df['ITEM'] = pd.np.where(df.PROD_TYPE == "PK",
df.PKG_TYPE.map(pack_dict),
df.PROD_TYPE.map(prod_dict))
In []: df
Out[]:
PROD_TYPE PKG_TYPE VALUE ITEM
0 PK PK3 1000 Misc Packaging
1 ML PK4 900 Mix
2 ML PK4 800 Mix
3 CM PK9 700 Textile
請注意,numpy已經(jīng)由 加載pandas,只需使用pd.np.

TA貢獻1829條經(jīng)驗 獲得超7個贊
一種方法是:
df["ITEM"]= [pack_dict[row[1]["PKG_TYPE"]]
if row[1]["PROD_TYPE"] == "PK"
else prod_dict[row[1]["PROD_TYPE"]]
for row in df.iterrows()]
我發(fā)現(xiàn)這比 Erfan 的解決方案快 10 倍。
添加回答
舉報