Python 仅当列组不仅包含nan值时才更改nan值

Python 仅当列组不仅包含nan值时才更改nan值,python,pandas,data-cleaning,Python,Pandas,Data Cleaning,我有一个数据框架,其中列组属于一起。现在,我想每行测试以下内容: 如果特定列组的所有行均为nan,则不执行任何操作 如果该组列(每行)中只有部分列为nan,请将其更改为另一个值(例如,更改为999) 因此,如果这是我的初始数据帧(以下列组属于一起:组1:Q1_1,Q1_2,Q1_3;组2:Q2_1,Q2_2) 这应该是结果: ID Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 1 nan nan nan 2 999 2 999 3 999

我有一个数据框架,其中列组属于一起。现在,我想每行测试以下内容:

  • 如果特定列组的所有行均为nan,则不执行任何操作
  • 如果该组列(每行)中只有部分列为nan,请将其更改为另一个值(例如,更改为999)
  • 因此,如果这是我的初始数据帧(以下列组属于一起:组1:Q1_1,Q1_2,Q1_3;组2:Q2_1,Q2_2)

    这应该是结果:

    ID  Q1_1  Q1_2  Q1_3  Q2_1  Q2_2 
     1  nan   nan   nan    2    999
     2  999    3    999    3     1
     3   5     4     4     5     5
     4   2     4     3     5     4
    

    这样试试。创建一个布尔掩码
    m
    ,以标识列组中的所有
    nan
    。使用
    999
    填充所有
    nan
    ,并使用
    mask
    切换回所有
    nan

    import numpy as np
    
    m = df.isna().groupby(df.columns.str.split('_').str[0], axis=1).transform('all')
    df_final = df.fillna(999).mask(m, np.nan)
    
    
    Out[74]:
       ID   Q1_1  Q1_2   Q1_3  Q2_1   Q2_2
    0   1    NaN   NaN    NaN     2  999.0
    1   2  999.0   3.0  999.0     3    1.0
    2   3    5.0   4.0    4.0     5    5.0
    3   4    2.0   4.0    3.0     5    4.0
    
    import numpy as np
    
    m = df.isna().groupby(df.columns.str.split('_').str[0], axis=1).transform('all')
    df_final = df.fillna(999).mask(m, np.nan)
    
    
    Out[74]:
       ID   Q1_1  Q1_2   Q1_3  Q2_1   Q2_2
    0   1    NaN   NaN    NaN     2  999.0
    1   2  999.0   3.0  999.0     3    1.0
    2   3    5.0   4.0    4.0     5    5.0
    3   4    2.0   4.0    3.0     5    4.0