如何用列名替换类别的fillna?

时间:2019-07-03 03:39:12

标签: python pandas

我有一个熊猫数据框,我想用'colname_miss'字符串填充缺失的类别。

def FillCatMissing(df):
    cols = ['A','B','C']
    df[cols] = df[cols].fillna('miss')
    return df

这会用字符串'miss'填充所有丢失的类别,我需要像A列一样是'A_miss',B列一样像'B_miss'。...

3 个答案:

答案 0 :(得分:2)

for col in df.columns:
    df[col].fillna(col+'_miss', inplace=True)

答案 1 :(得分:1)

为什么不applyreplace

def FillCatMissing(df):
    cols = ['A','B','C']
    df[cols] = df[cols].apply(lambda x: x.replace(np.nan, x.name + '_miss'))
    return df

答案 2 :(得分:1)

设置

df = pd.DataFrame(dict(A=['a', None], B=[None, 'b'], C=[None, None]))

df

      A     B     C
0     a  None  None
1  None     b  None

dict传递到fillna

熊猫有一种处理此问题的特定方法。您可以将字典传递给fillna方法,该方法定义用于替换每列的空值的方法,而不是遍历各列并分别填充每一列。换句话说,这就是应该做的方式。

在这种情况下,您希望字典的键与要填充的列名匹配。

df.fillna({k: f'{k}_miss' for k in df})  # This is the answer you are looking for

        A       B       C
0       a  B_miss  C_miss
1  A_miss       b  C_miss

我们可以只将其保留在列'A''B'

df.fillna({k: f'{k}_miss' for k in ['A', 'B']})

        A       B     C
0       a  B_miss  None
1  A_miss       b  None

这将单独保留列'C'

最后,这将生成一个带有结果的副本,而不是对现有数据框进行突变。如果要覆盖现有数据框,则只需分配相同的名称

df = df.fillna({k: f'{k}_miss' for k in df})

尽管我显然更喜欢其他答案,但这是另一种解决方法。

df.fillna(df.columns.to_series().add('_miss'))

        A       B       C
0       a  B_miss  C_miss
1  A_miss       b  C_miss