使用列值选择性替换NaN

2024-06-01 22:39:13 发布

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

我有一个数据帧:

   GType   BNM  XXCV  COO
0  CAT1  WERT   NaN  NaN
1  CAT3  FRGT   NaN  NaN
2  CAT3   NaN   NaN  NaN
3  CAT2   NaN   NaN  NaN

我需要使用GType有选择地用空格或文本"vvv"替换NaN。你知道吗

我有以下代码:

list1 = ['CAT1','CAT2']
mask = (df.COO.isnull()|df.BNM.isnull()|df.XXCV.isnull()) & (df.GType.isin(list1))
df.loc[mask, ('COO',  'BNM', 'XXCV')] = df.loc[mask, ('COO', 'XXCV', 'BNM'].replace('NaN', '')

list12 = ['CAT3']
mask12 =df.COO.isnull()|df.BNM.isnull())& (df.GType.isin(list12))
df.loc[mask12, ('COO',  'BNM')] = df.loc[mask12, ('COO', 'BNM')].replace('NaN', '')

它运行并更改list1中的GType项,并保留list12中的项。现在我得到:

   GType   BNM XXCV  COO
0  CAT1  WERT          
1  CAT3  FRGT  NaN  NaN
2  CAT3   NaN  NaN  NaN
3  CAT2   NaN

我期望的结果是:

   GType   BNM XXCV  COO
0  CAT1  WERT          
1  CAT3  FRGT  NaN  
2  CAT3         NaN 
3  CAT2   

我哪里弄错了?你知道吗


Tags: dfmasknanlocbnmcat1list1cat2
1条回答
网友
1楼 · 发布于 2024-06-01 22:39:13

这应该能奏效

import pandas as pd

df = pd.DataFrame({
    'GType': ['CAT1', 'CAT3', 'CAT3', 'CAT2'],
    'BNM': ['WERT', 'FRGT', None, None],
    'XXCV': [None, None, None, None],
    'COO': [None, None, None, None],
})

to_nan_xxcv = (df.XXCV.isnull()) & (df.GType.isin(['CAT1', 'CAT2']))
to_nan_rest = (df.COO.isnull() | df.BNM.isnull())
df.loc[to_nan_xxcv, 'XXCV'] = df.loc[to_nan_xxcv, 'XXCV'].fillna('')
df.loc[to_nan_rest, ('COO', 'BNM')] = df.loc[to_nan_rest, ('COO', 'BNM')].fillna('')
print(df)

to_nan_xxcv将只过滤您想要的内容,其余内容将独立地替换在GType上,这显然是您基于所需输出想要的内容。 此外,还可以通过调用.fillna('vvv')替换为vvv

相关问题 更多 >