定义在 pandas 数据框中填充 NaN 的策略?
Define a strategy of filling NaNs in pandas dataframe?
我有一个混合类型的数据框 - 字符串、浮点数、整数、布尔值。
pd.DataFrame({'a': [6.6, -5.2, 2.1, float('NaN'), float('NaN')],
'b': ['a', 'a', 'NaN', 'b', 'NaN'],
'c': [True, True, False, float('NaN'), float('NaN')],
'd': [1,2,3,None, None]})
这些列中的大多数都有一些 NaN。
我想根据一些自定义规则来估算缺失值:
对于每个浮点型列 - 取该列的中位数并估算。
对于每个字符串列 - 取众数并估算。
对于每个整数列 - 取中位数、ceil 和 impute。
对于每个 bool 列 - 用 False 估算缺失值。
这就是我到目前为止所做的:
fill_na_policy = {'float64': np.median(),
'int': np.ceil(np.median()),
'string': scipy.stats.mode(),
'bool': False}
df.fillna(df.dtypes.replace(fill_na_policy), inplace=True)
请告知如何让它工作,或者我应该为每种类型创建 lambda 函数吗?
为各种数据类型创建一个系列:
# create more variables depending on the dtype
floats = df.select_dtypes(float).median()
strings = df.select_dtypes('object').mode().stack().droplevel(0)
fill_vals = pd.concat([floats, strings])
现在填充数据框(列是 fill_vals 中的索引,每个对应列的值将被替换):
df.fillna(fill_vals)
您可以使用 select_dtypes
区分和 select 不同类型的列,并使用您想要的数据帧的每个单独部分的技术进行估算。考虑以下示例:
# Select numeric columns
f = df.select_dtypes('float64')
i = df.select_dtypes('int64')
# Select string and boolean columns
o = df.select_dtypes('object')
b = df.select_dtypes(include='bool')
# Fill numeric
df[f.columns] = f.fillna(f.median())
df[i.columns] = i.fillna(np.ceil(np.median(i)))
# Fill object
df[o.columns] = o.fillna(o.agg(lambda x: x.mode().values[0]))
df[b.columns] = b.fillna(False)
哪个会给你:
a b c d
0 6.6 a True 1.0
1 -5.2 a True 2.0
2 2.1 a False 3.0
3 2.1 b True 2.0
4 2.1 a True 2.0
我有一个混合类型的数据框 - 字符串、浮点数、整数、布尔值。
pd.DataFrame({'a': [6.6, -5.2, 2.1, float('NaN'), float('NaN')],
'b': ['a', 'a', 'NaN', 'b', 'NaN'],
'c': [True, True, False, float('NaN'), float('NaN')],
'd': [1,2,3,None, None]})
这些列中的大多数都有一些 NaN。 我想根据一些自定义规则来估算缺失值: 对于每个浮点型列 - 取该列的中位数并估算。 对于每个字符串列 - 取众数并估算。 对于每个整数列 - 取中位数、ceil 和 impute。 对于每个 bool 列 - 用 False 估算缺失值。
这就是我到目前为止所做的:
fill_na_policy = {'float64': np.median(),
'int': np.ceil(np.median()),
'string': scipy.stats.mode(),
'bool': False}
df.fillna(df.dtypes.replace(fill_na_policy), inplace=True)
请告知如何让它工作,或者我应该为每种类型创建 lambda 函数吗?
为各种数据类型创建一个系列:
# create more variables depending on the dtype
floats = df.select_dtypes(float).median()
strings = df.select_dtypes('object').mode().stack().droplevel(0)
fill_vals = pd.concat([floats, strings])
现在填充数据框(列是 fill_vals 中的索引,每个对应列的值将被替换):
df.fillna(fill_vals)
您可以使用 select_dtypes
区分和 select 不同类型的列,并使用您想要的数据帧的每个单独部分的技术进行估算。考虑以下示例:
# Select numeric columns
f = df.select_dtypes('float64')
i = df.select_dtypes('int64')
# Select string and boolean columns
o = df.select_dtypes('object')
b = df.select_dtypes(include='bool')
# Fill numeric
df[f.columns] = f.fillna(f.median())
df[i.columns] = i.fillna(np.ceil(np.median(i)))
# Fill object
df[o.columns] = o.fillna(o.agg(lambda x: x.mode().values[0]))
df[b.columns] = b.fillna(False)
哪个会给你:
a b c d
0 6.6 a True 1.0
1 -5.2 a True 2.0
2 2.1 a False 3.0
3 2.1 b True 2.0
4 2.1 a True 2.0