代码之家  ›  专栏  ›  技术社区  ›  wwnde

使用相同列值选择性替换NaN

  •  0
  • wwnde  · 技术社区  · 6 年前

    我有一个数据帧:

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

    我需要有选择地更换 NaN 是空格还是文本 "vvv" 使用 GType .

    我有以下代码:

    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', '')
    

    它运行并更改列表1中的GType项,并将这些项保留在列表12中。现在我得到:

       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   
    

    我哪里弄错了?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Matěj Račinský    6 年前

    这应该能奏效

    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 ,这显然是你想要的基于期望的输出。 此外,你还可以用 vvv 打电话 .fillna('vvv')