如何使用 pandas 根据列模式填充缺失值?
How to fill missing values based on column patterns using pandas?
我有一个如下所示的数据框
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
的原始值?
我得到如下所示的输出是不正确的
我的预期输出如下
让我们重新定义 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
我有一个如下所示的数据框
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
的原始值?
我得到如下所示的输出是不正确的
我的预期输出如下
让我们重新定义 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