根据条件在熊猫数据框中添加新列,并替换不同列中的Nan值

时间:2018-07-19 16:12:14

标签: pandas numpy

我正在尝试根据特定条件使用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时还很新,所以请帮助我。

3 个答案:

答案 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的回答会更好。