【问题标题】:Pandas: If a row contains this substring, update a cell in this rowPandas:如果一行包含此子字符串,则更新此行中的一个单元格
【发布时间】:2020-01-10 16:17:32
【问题描述】:

我有一个包含几列的数据框:descriptionqtyclient_name。通常有几百行。我正在寻找将遍历这些行的代码,检查descriptionclient_name 列中的值是否包含特定的子字符串,并将单元格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

我希望所有包含“john”的name client 将其qty 乘以4。

对于所有包含“bob”的name client,将其qty 乘以2

对于所有包含“eric”的name client,将数量乘以2除了所有包含“DV”的descriptions,将其qty 乘以8。

【问题讨论】:

  • 您能否提供一个示例数据框以及您需要检查哪些子字符串的更多详细信息?
  • 我编辑了这个问题来展示一个例子。

标签: python pandas dataframe iteration


【解决方案1】:

这是一个非常具体的解决方案,它假定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

【讨论】:

  • 这看起来很整洁,谢谢!如果我想添加另一个条件怎么办?例如:如果name_client 是 Eric,则不应将 kiwi 的 qty 相乘。
  • 如果您使用互斥和集体穷举条件,您可以创建不同的掩码为DV_mask,并在1- (mask1 | mask2 | ... | maskN) 上使用“标准”条件(据我了解是df['multiplier']
【解决方案2】:

假设数据框df:

substring = 'test'
fixed_num = 2
df['quantity'] = df[df['description'].str.contains(substring) | df['client_name'].str.contains(substring)].quantity * fixed_num

【讨论】:

  • 这不起作用,我只是添加了一个示例以进行更多说明。
【解决方案3】:

所以经过多次尝试,我找到了解决方法。它并不完美,但在我的情况下有效,可能会对某人有所帮助:

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

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2012-08-05
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多