我正在尝试根据特定条件使用numpy在数据框中添加新列,因此该框看起来像这样。
import pandas as pd
import numpy as np
rawData = ({'a': [None,2,3], 'b': [5,6,8],'currency':['AUD','SA','NZD']})
df = pd.DataFrame(rawData)
print(df)
a b currency
0 NaN 5 AUD
1 2.0 6 SA
2 3.0 8 NZD
根据条件添加列:
mask1 = df['currency'].isin(['AUD'])
choice_mask1 = df['a']
mask2 = df['currency'].isin(['SA','NZD'])
choice_mask2= df['b']
df['c'] = np.select([mask1,mask2],[choice_mask1,choice_mask2],default = 0.00)
print(df)
a b currency c
0 NaN 5 AUD NaN
1 2.0 6 SA 6.0
2 3.0 8 NZD 8.0
因此 C 列中的输出具有NaN值,我不希望这样。 因此,如果a列中存在NaN,则新添加的列需要考虑b列中的值。
我在使用numpy时还很新,所以请帮助我。
答案 0 :(得分:4)
您可以简化代码
df['c'] = 0
cond = (df['currency'].isin(['AUD'])) & (df['a'].notnull())
df['c'] = np.where(cond, df['a'], df['b'])
a b currency c
0 NaN 5 AUD 5.0
1 2.0 6 SA 6.0
2 3.0 8 NZD 8.0
编辑:正如@ Ben.T所指出的那样,如果您正在查看具有不同货币的观察值,则需要调整条件。
rawData = ({'a': [None,2,3, 5, 3], 'b': [5,6,8, 1,6],'currency':['AUD','SA','NZD', 'AUD', 'US']})
df = pd.DataFrame(rawData)
df['c'] = 0
cond1 = (df['currency'].isin(['AUD'])) & (df['a'].notnull())
cond2 = (df['currency'].isin(['SA','NZD'])) | (df['currency'].isin(['AUD'])) & (df['a'].isnull())
df.loc[cond1, 'c'] = df['a']
df.loc[cond2, 'c'] = df['b']
a b currency c
0 NaN 5 AUD 5.0
1 2.0 6 SA 6.0
2 3.0 8 NZD 8.0
3 5.0 1 AUD 5.0
4 3.0 6 US 0.0
或使用np.select
mask1 = (df['currency'].isin(['AUD'])) & (df['a'].notnull())
choice_mask1 = df['a']
mask2 = (df['currency'].isin(['SA','NZD'])) | (df['currency'].isin(['AUD'])) & (df['a'].isnull())
choice_mask2= df['b']
df['c'] = np.select([mask1,mask2],[choice_mask1,choice_mask2],default = 0.00)
答案 1 :(得分:2)
一种可能性是在创建fillna
时使用b
和列choice_mask1
中的值,例如
choice_mask1 = df['a'].fillna(df['b'])
,其余部分相同。您的输出如下:
a b currency c
0 NaN 5 AUD 5.0
1 2.0 6 SA 6.0
2 3.0 8 NZD 8.0
答案 2 :(得分:1)
使用combine_first
实际上非常简单:
df['c'] = df.a.combine_first(df.b)
编辑:这实际上并没有回答您的问题,因为您似乎想掩盖您的结果,因此在这种情况下,@ ben.t的回答会更好。