基于条件的新列

时间:2019-03-23 13:13:29

标签: python pandas dataframe

当前如果另一列中存在某些值,则尝试更改数据框中的某些市场值。我只熟悉用于创建新列的列表理解,但是我不确定这样做是否可行。

我尝试了以下功能,尽管不起作用:


def multiply_with(x):
    if df['a'] in list_multiple_double: 
        x = x * 0.5
    elif df['a'] in list_multiple_triple:  
        x = x * 0.33
    else: 
        x = x
    return x

我尝试将其应用于“市场价值”列,但没有运气。

假设在pd.dataframe中有两列a和b,我想创建c。还要假设2个列表,list_alist_b。对于每个观察,如果a中存在list_a,则乘以0.5并将其返回到列c中。如果a中存在list_,则乘以0.333并返回c。如果不存在,则在a中返回c。我需要以下内容:

list_a = ['Denmark Sweden', 'Norway Sweden']
list_b = ['Denmark Sweden Norway']


values = [200,300,500,1000,200]
country = ['Denmark', 'Denmark Sweden', 'Denmark Sweden Norway', 'Sweden', 'Norway']
values_adj = [200, 150, 166.67, 1000, 200]

df = pd.DataFrame()
df['values'] = pd.Series(values)
df['country'] = pd.Series(country)
df['values_adj'] = pd.Series(values_adj)

2 个答案:

答案 0 :(得分:2)

df['values_adj'] = df['values']
df.loc[df['country'].isin(list_a), 'values_adj'] *= 0.5
df.loc[df['country'].isin(list_b), 'values_adj'] *= 0.33

答案 1 :(得分:2)

使用np.select

df['values_adj'] = np.select([df['country'].isin(list_a), df['country'].isin(list_b)], [df['values']*0.5, df['values']*0.333], df['values'])

print(df)

输出:

values                country  values_adj
0     200                Denmark       200.0
1     300         Denmark Sweden       150.0
2     500  Denmark Sweden Norway       166.5
3    1000                 Sweden      1000.0
4     200                 Norway       200.0