Условный vlookup в Python 3 - PullRequest
       7

Условный vlookup в Python 3

0 голосов
/ 25 декабря 2018

пожалуйста, помогите.Существует фрейм данных:

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)
    )
)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы можете сделать это с помощью pd.merge примерно так:

 #create new dataframe with ArtNo created from part of the Description
 df2 = df.copy()[['Description']]
 df2.columns = ['ArtNo']
 df2['ArtNo'] = df2['ArtNo'].str.split(n=1).str[0]

 #merge price from the first dataframe
 df2 = pd.merge(df2, df[['ArtNo', 'Price']], how='left', on='ArtNo')

 #create a new column 'Price (multiplied)' and fill NANs from original 'Price' column
 df['Price (multiplied)'] = df2['Price'].values
 df['Price (multiplied)'] = df['Price (multiplied)'].fillna(df['Price']).astype(int)
0 голосов
/ 25 декабря 2018

Вы можете построить отображение серии и применить его к первому слову 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
...