Pandas: если строка содержит эту подстроку, обновите ячейку в этой строке - PullRequest
0 голосов
/ 10 января 2020

У меня есть датафрейм с несколькими столбцами: description, qty, client_name. Обычно там несколько сотен рядов. Я ищу код, который будет перебирать эти строки, проверять, содержит ли значение в столбцах description или client_name указанную подстроку c, и умножать ячейку quantity на фиксированное число.

description | qty | name client
apple       |  2  |  John Doe
orange      |  4  |  Bob WH1
banana      |  1  |  Bob WH2
DV mango    |  2  |  Eric
pear        |  1  |  Bob WH3
kiwi        |  2  |  Eric

Я хотел бы, чтобы для всех name client, которые содержат 'john', умножьте его qty на 4.

Для всех name client, которые содержат 'bob', умножьте его qty на 2

Для всех name client, которые содержат 'eri c', умножьте qty на 2 , кроме всех descriptions, которые содержат 'DV' , умножьте его qty на 8.

Ответы [ 3 ]

1 голос
/ 11 января 2020

Это очень конкретное c решение, которое предполагает, что столбец client_name всегда начинается с имени клиента.

import pandas as pd

# Create dataframe
df = pd.DataFrame(data={
    'description':['apple', 'orange', 'banana', 'DV mango', 'pear', 'kiwi'],
    'qty': [2,4,1,2,1,2],
    'name_client': ['John Doe', 'Bob WH1', 'Bob WH2', 'Eric', 'Bob', 'Eric']})

# List of original columns
cols = list(df)

# Name to Multiplier value 
name_to_mult = {
    'Bob': 2,
    'John': 4,
    'Eric': 2}

#Create ausiliary, temporary columns
df['first_name'] = df['name_client'].str.split().str[0]
df['multiplier'] = df['first_name'].map(name_to_mult)

# Define a boolean mask, True if DV in description
DV_mask = df['description'].str.contains('DV')

# Compute the result
df['result'] =  df['qty']*(8*DV_mask + (1-DV_mask)*df['multiplier'])

cols.append('result')
df = df[cols]
df

   description  qty name_client  result
0       apple    2    John Doe       8
1      orange    4     Bob WH1       8
2      banana    1     Bob WH2       2
3    DV mango    2        Eric      16
4        pear    1         Bob       2
5        kiwi    2        Eric       4
1 голос
/ 10 января 2020

Предположим, датафрейм df:

substring = 'test'
fixed_num = 2
df['quantity'] = df[df['description'].str.contains(substring) | df['client_name'].str.contains(substring)].quantity * fixed_num
0 голосов
/ 11 января 2020

Так что после многих попыток я нашел обходной путь. Это не идеально, но работает в моем случае и может кому-то помочь, вот оно:

df.loc[df['nameclient'].astype(str).str[0] == 'J', 'qty'] *= 4
df.loc[df['nameclient'].astype(str).str[0] == 'B', 'qty'] *= 2
df.loc[df['nameclient'].astype(str).str[0] == 'E', 'qty'] *= 2
df.loc[df['description'].astype(str).str[0] == 'D', 'qty'] *= 4
...