【问题标题】:Applying function to pandas column based on other columns基于其他列将函数应用于pandas列
【发布时间】:2021-07-30 19:30:01
【问题描述】:

我有一个df

cur    val
USD    50
GBP    100
EUR    150

我正在尝试将所有值转换为英镑:

def sales_gbp(df):
    cur = df.cur
    value = df.val

    if cur == 'USD':
        return val*0.72
    elif cur == 'EUR':
        return val*0.85
    else:
        return val
    
df['value_GBP'] = df.apply(sales_gbp(df), axis=1)

但我明白了:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

----> 5 如果 cur == 'USD':

df.dtypes 为cur 和val 返回object。我已经阅读了this answer,但我仍然无法将该功能应用于我的df。

【问题讨论】:

  • 不要传df,传df.apply(sales_gbp axis=1)

标签: python pandas


【解决方案1】:

我建议在函数中使用变量x 来明确它是不同于原始df 的变量,然后不要将df 传递给DataFrame.apply:

def sales_gbp(x):
    cur = x.cur
    val = x.val

    if cur == 'USD':
        return val*0.72
    elif cur == 'EUR':
        return val*0.85
    else:
        return val

df['value_GBP'] = df.apply(sales_gbp, axis=1)

更好的是通过dict 进行映射,对于不匹配的值,dict 是返回NaN,所以用1 替换它们:

d = {'USD':0.72, 'GBP':0.85}
df['value_GBP'] = df['cur'].map(d).fillna(1).mul(df['val'])
print (df)
   cur  val  value_GBP
0  USD   50       36.0
1  GBP  100       85.0
2  EUR  150      150.0

或者在Series.mul中使用fill_value=1:

d = {'USD':0.72, 'GBP':0.85}
df['value_GBP'] = df['cur'].map(d).mul(df['val'], fill_value=1)

【讨论】:

    【解决方案2】:

    您也可以直接使用该系列:

    样本数据

    import pandas as pd
    
    d = {'cur': {0: 'USD', 1: 'GBP', 2: 'EUR'}, 'val': {0: 50, 1: 100, 2: 150}}
    df = pd.DataFrame(d)
    

    代码

    dct = {'GBP': 1, 'USD': 0.72, 'EUR': 0.85}
    df['value_GBP'] = df['cur'].map(dct) * df['val']
    

    输出

    0     36.0
    1    100.0
    2    127.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2019-01-10
      • 2017-05-14
      • 1970-01-01
      • 2018-11-10
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多