首页 > 解决方案 > Python 3 中的条件查找

问题描述

请帮忙。有数据框:

ArtNo   Description     Price

AAA     Lore Ipsum      10
BBB     Lore Ipsum      9
CCC     Lore Ipsum      8
DDD     AAA Lore Ipsum  0
EEE     BBB Lore Ipsum  0
FFF     CCC Lore Ipsum  0
GGG     ZZZ Lore Ipsum  0
HHH     AAA Lore Ipsum  0

我需要从 ArtNo 列中的文章中的描述列中添加一个乘以价格而不是零的列。如果不匹配(ArtNo 列和 Description 中的第一个单词到空格之间),则将同一行中 Price 列中的相同数字应用于“乘列”:

ArtNo   Description     Price   Price (multiplied) ???

AAA     Lore Ipsum      10      10  
BBB     Lore Ipsum      9       9   
CCC     Lore Ipsum      8       8   
DDD     AAA Lore Ipsum  0       10  
EEE     BBB Lore Ipsum  0       9   
FFF     CCC Lore Ipsum  0       8
GGG     ZZZ Lore Ipsum  0       0
HHH     AAA Lore Ipsum  0       10

在 excel 中它是这样工作的:

IF (Price != 0; Price multiplied = Price;
    IF(ISERROR(VLOOKUP(MID(Description;1;FIND(
        ' ';Description;1));TABLE;3;0));Price multiplied = Price;
    ESLE: Price multiplied = VLOOKUP(MID(Description;1;FIND(
        ' ';Description;1));TABLE;3;0)
    )
)

提前致谢。

标签: pythonpandasvlookup

解决方案


您可以构建一个系列映射并将其应用于Description.

zeros = df['Price'].eq(0)
art_price_map = df[~zeros].set_index('ArtNo')['Price']
first_word = df['Description'].str.split(n=1).str[0]

df['Price (multiplied)'] = df['Price'].mask(zeros, first_word.map(art_price_map))\
                                      .fillna(0).astype(int)

print(df)

  ArtNo     Description  Price  Price (multiplied)
0   AAA      Lore Ipsum     10                  10
1   BBB      Lore Ipsum      9                   9
2   CCC      Lore Ipsum      8                   8
3   DDD  AAA Lore Ipsum      0                  10
4   EEE  BBB Lore Ipsum      0                   9
5   FFF  CCC Lore Ipsum      0                   8
6   GGG  ZZZ Lore Ipsum      0                   0

推荐阅读