我有一个这样的数据框:
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
答案 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)