У меня есть фрейм данных, как показано ниже

import pandas as pd
import numpy as np
df = pd.DataFrame({'source_value':['Male','Female',np.nan,np.nan,np.nan,'M'],
                       'new_id':[1,2,3,4,5,6],
                       'month_of_birth':[11,12,1,3,5,6],
                       'day_of_birth':[11,21,23,26,10,12],
                       'year_of_birth':[1967,1987,1956,1999,2005,1987],
                       'datetime_off':['11/11/1967','21/12/1987','23/01/1956','26/03/1999','10/05/2005','12/06/1987'],
'test_id':[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})

Я хотел бы заполнить отсутствующие значения в столбце ключевыми словами id, value и datetime.

Я пробовал следующее, основанное на startswith, endswith и contains

col = df.columns.str
c1 = col.endswith('id')
c2 = col.contains('value')
c3 = col.contains('datetime')
missing_value_filled = np.select([c1,c2,c3],[df.fillna(0),df.fillna(np.nan),df.fillna("01/01/2000 00:00:00")])
pd.DataFrame(missing_value_filled, columns=df.columns)

Но проблема в том, что он делает month_of_birth, day_of_birth и year_of_birth как zeroes, даже если они не соответствуют моему шаблону, упомянутому выше. Могу я узнать, почему это происходит?

Как я могу сохранить исходные значения month, day и year столбцов рождения?

Я получаю неверный результат, как показано ниже

enter image description here

Мой ожидаемый результат дан ниже

enter image description here

1
The Great 28 Фев 2021 в 12:40

1 ответ

Лучший ответ

Давайте переопределим функцию fillna, которая принимает аргументы в качестве входных df, маски столбцов (col_masks) вместе с соответствующими значениями заполнения (fill_values):

def fillna(df, col_masks, fill_values):
    df = df.copy()
    for m, v in zip(col_masks, fill_values):
        df.loc[:, m] = df.loc[:, m].fillna(v)
    return df

>>> fillna(df, [c1, c2, c3], [0, np.nan, '01/01/2000 00:00:00'])

  source_value  new_id  month_of_birth  day_of_birth  year_of_birth datetime_off  test_id
0         Male       1              11            11           1967   11/11/1967      0.0
1       Female       2              12            21           1987   21/12/1987      0.0
2          NaN       3               1            23           1956   23/01/1956      0.0
3          NaN       4               3            26           1999   26/03/1999      0.0
4          NaN       5               5            10           2005   10/05/2005      0.0
5            M       6               6            12           1987   12/06/1987      0.0
1
Shubham Sharma 28 Фев 2021 в 10:09