У меня есть фрейм данных pandas, я хочу заполнить недостающие категории строкой «colname_miss».

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

Это заполняет все пропущенные категории строкой «miss», мне нужно быть похожим на «A_miss» для столбца A, «B_miss» для столбца B ....

2
hanzgs 3 Июл 2019 в 06:39

3 ответа

Лучший ответ
for col in df.columns:
    df[col].fillna(col+'_miss', inplace=True)
2
rmrouse88 3 Июл 2019 в 03:42

Почему бы не apply с replace:

def FillCatMissing(df):
    cols = ['A','B','C']
    df[cols] = df[cols].apply(lambda x: x.replace(np.nan, x.name + '_miss'))
    return df
1
U10-Forward 3 Июл 2019 в 03:43

Настроить

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
1
piRSquared 3 Июл 2019 в 04:11