2

我有一个df

cur    val
USD    50
GBP    100
EUR    150

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

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返回和。object_ 我已经阅读了这个答案,但我仍然无法将该功能应用于我的.curvaldf

4

2 回答 2

4

我建议x在函数中使用变量以明确它是与原始变量不同的变量df,然后不要传递dfDataFrame.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 是 return 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

fill_value=1用于Series.mul

d = {'USD':0.72, 'GBP':0.85}
df['value_GBP'] = df['cur'].map(d).mul(df['val'], fill_value=1)
于 2021-07-30T11:23:06.860 回答
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
于 2021-07-30T11:24:03.717 回答