Pandas 版本的“如果为真,则在此处 VLOOKUP,如果为假,则在其他地方进行 VLOOKUP

我正在尝试将大型数据集及其处理从 Excel 转换为 Python/Pandas,并且在尝试实现“IF(col A = x, VLOOKUP(col B in table Y),否则为 VLOOKUP(表 Z 中的列 A))”。


我创建了两个单独的字典,它们将用作表 Y 和 Z 的 Pandas 版本,但我一直无法找到可以告诉 Pandas 使用 B 列中的值在字典中查找的构造。


用熊猫尝试这个:


# Created a function to map the values from

#  PROD_TYPE to the prod_dict.

def map_values(row, prod_dict):

    return prod_dict[row]


# Created the dictionaries / old VLOOKUP tables.

prod_dict = {'PK': 'Packaging',

               'ML': 'Mix',

               'CM': 'Textile',

               'NK': 'Metallic'}


pack_dict = {'PK3' : 'Misc Packaging',

             'PK4' : 'Mix Packaging',

             'PK9' : 'Textile Packaging'}


df = pd.DataFrame({'PROD_TYPE' : ['PK', 'ML', 'ML', 'CM'], 

                   'PKG_TYPE': ['PK3', 'PK4', 'PK4', 'PK9'],

                   'VALUE': [1000, 900, 800, 700]})

# Apply the map_values function.

df['ITEM'] = df['PROD_TYPE'].apply(map_values, args = (prod_dict,))

我得到:


  PROD_TYPE PKG_TYPE  VALUE       ITEM

0        PK      PK3   1000  Packaging

1        ML      PK4    900        Mix

2        ML      PK4    800        Mix

3        CM      PK9    700    Textile

当我正在寻找的是:


  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

或者,更简单地说:如果PROD_TYPE是'PK',则从; 中的列PKG_TYPE中查找值pack_dict。否则,PROD_TYPE在prod_dict.


任何帮助,将不胜感激!


芜湖不芜
浏览 222回答 3
3回答

慕无忌1623718

这是我将如何解决这个问题:# First we make two dataframes out of the dictionaries with pd.meltdf2 = 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   ITEM0   PK          Packaging1   ML          Mix2   CM          Textile3   NK          Metallic# df3    PKG_TYPE    ITEM0   PK3         Misc Packaging1   PK4         Mix Packaging2   PK9         Textile Packaging# Now we can merge our information together on keycolumns PROD_TYPE and PKG_TYPEdf_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_y0   PK          PK3         1000    Packaging   Misc Packaging1   ML          PK4         900     Mix         Mix Packaging2   ML          PK4         800     Mix         Mix Packaging3   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 outputdf_final.drop(['ITEM_x', 'ITEM_y'], axis=1, inplace=True)输出    PROD_TYPE   PKG_TYPE    VALUE   ITEM0   PK          PK3         1000    Misc Packaging1   ML          PK4         900     Mix2   ML          PK4         800     Mix3   CM          PK9         700     Textilenp.where来自numpy模块,工作原理如下:np.where(condition, true value, false value)

烙印99

类似于@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 []: dfOut[]:  PROD_TYPE PKG_TYPE  VALUE            ITEM0        PK      PK3   1000  Misc Packaging1        ML      PK4    900             Mix2        ML      PK4    800             Mix3        CM      PK9    700         Textile请注意,numpy已经由 加载pandas,只需使用pd.np.

吃鸡游戏

一种方法是: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()]我发现这比 Erfan 的解决方案快 10 倍。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python