根据条件替换列中的值

2024-06-28 10:59:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

        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,只要SP1中有一个非NaN值。如果发生这种情况,我想用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

Tags: keydfnanpolysp2sp1bougraeupesu
2条回答

这是怎么回事?你知道吗

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

在SP1和SP2都是NaN的情况下,您也只需复制NaN

使用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.哪里地址:

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

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

相关问题 更多 >