根据条件替换列中的值

时间:2015-12-03 02:19:38

标签: python pandas

我有一个这样的数据框:

        POLY_KEY_I         SP1        SP2
0     FS01080100SM001       POAPRA    TOXRYD
1     FS01080100SM001       NaN       NaN
2     FS01080100SM001       OXRYD     SYMOCC
3     FS01080100SM001       EUPESU    POAPRA
4     FS01080100SM001       BOUGRA    KOEPYR
5     FS01080100SM002       POAPRA    EUPESU
6     FS01080100SM002       POAPRA    NaN
7     FS01080100SM002       POAPRA    KOEPYR

并且我希望仅在NaN中存在非SP2值时替换NaN中的SP1。如果发生这种情况,我想用SP1中的值替换它。我想要的输出是:

        POLY_KEY_I         SP1        SP2
0     FS01080100SM001       POAPRA    TOXRYD
1     FS01080100SM001       NaN       NaN
2     FS01080100SM001       OXRYD     SYMOCC
3     FS01080100SM001       EUPESU    POAPRA
4     FS01080100SM001       BOUGRA    KOEPYR
5     FS01080100SM002       POAPRA    EUPESU
6     FS01080100SM002       POAPRA    POAPRA
7     FS01080100SM002       POAPRA    KOEPYR

SP1中有大约100个唯一值,因此我无法手动执行此操作,因为我始终不知道SP1中的字符串是什么。

编辑: 另一种对我有用的方法是说SP2 == NaN是否会返回SP1

的值

我已经尝试过这段代码,但它提供了字符串SP1(显然),我不知道如何返回实际值。这是代码:

def f(x):
  if x['SP2'] == 'NaN' : return 'SP1'
df['SP2'] = df.apply(f, axis=1)    
print df

2 个答案:

答案 0 :(得分:0)

这是怎么回事?

df['SP2'][pandas.isnull(df['SP2'])] = df['SP1']

如果SP1和SP2都是NaN,您只需复制NaN

答案 1 :(得分:0)

使用loc和布尔值掩码覆盖值,如果' SP1'则无关紧要。已经NaN,结果是相同的:

In [244]:
df.loc[df['SP2'].isnull(), 'SP2'] = df['SP1']
df

Out[244]:
        POLY_KEY_I     SP1     SP2
0  FS01080100SM001  POAPRA  TOXRYD
1  FS01080100SM001     NaN     NaN
2  FS01080100SM001   OXRYD  SYMOCC
3  FS01080100SM001  EUPESU  POAPRA
4  FS01080100SM001  BOUGRA  KOEPYR
5  FS01080100SM002  POAPRA  EUPESU
6  FS01080100SM002  POAPRA  POAPRA
7  FS01080100SM002  POAPRA  KOEPYR

如果您想使用条件来返回特定列(如果不是NaN而另一列,如果是,则可以使用np.where:

In [246]:
np.where(df['SP2'].notnull(), df['SP2'], df['SP1'])

Out[246]:
array(['TOXRYD', nan, 'SYMOCC', 'POAPRA', 'KOEPYR', 'EUPESU', 'POAPRA',
       'KOEPYR'], dtype=object)