python - 为 pandas 中的不同列以不同方式填充缺失值
问题描述
假设我有一个包含不同类型列的数据框 - 数字和分类。我想填写数字列的中值和分类的随机值。
到目前为止,这就是我正在做的事情:
def fill_nulls(df, num_cols, cat_cols):
for col in num_cols:
dic[col] = 'median'
for col in cat_cols:
dic[col] = lambda x: x.sample(1)
df = df.apply(dic) #NOT SURE WHAT MUST BE HERE
我正在创建一个字典,为每一列指定所需的方法。但是现在我不确定如何使这项工作适用于缺失值。我相信它应该是这样的apply(dic)
,但我不确定如何使它仅适用于缺失值。
谢谢!
编辑:
我目前在做什么:
for col in cat_cols:
bools = pd.notnull(df[col])
notnulls = df[col][bools]
sample = notnulls.sample(1)
sample = sample.tolist()[0]
df[col] = df[col].fillna(value=sample)
for col in num_cols:
med = df[col].median()
print(type(med))
df[col] = df[col].fillna(value=med)
这可能不是最有效的方法。因此,如果有人知道更好的方法,那就太好了!谢谢!
解决方案
我在这里假设您的数据仅包含数字和分类列(没有日期时间列)。为了演示,首先设置一些示例数据:
import numpy as np
import pandas as pd
df = pd.DataFrame({0: ["0:00", np.nan, "12:00", np.nan, "06:00"],
1: [np.nan, 4, 12, 2, np.nan],
2: [100, 2, np.nan, -3.6, np.nan],
3: ["a", "b", "a", np.nan, np.nan]})
df
0 1 2 3
0 0:00 NaN 100.0 a
1 NaN 4.0 2.0 b
2 12:00 12.0 NaN a
3 NaN 2.0 -3.6 NaN
4 06:00 NaN NaN NaN
现在,根据您的要求填写缺失值:
# Fill numeric types with median
df = df.fillna(df.median())
# Fill rest of columns (categorical) with random value
df.apply(lambda x: x.fillna(np.random.choice(x[~x.isnull()])))
df
0 1 2 3
0 0:00 4.0 100.0 a
1 0:00 4.0 2.0 b
2 12:00 12.0 2.0 a
3 0:00 2.0 -3.6 a
4 06:00 4.0 2.0 a
推荐阅读
- git - 我可以恢复没有在本地保存的已删除 git 分支吗?
- slack-api - 在 Slack 中将远程文件作为直接消息共享
- image-processing - 重建图像与原始图像之间的误差图
- go - 仅当密钥不存在于 Google Datastore 中时才写入实体
- android - Recycler 视图中的表格布局
- swagger - 从 Swagger UI 隐藏复杂的只读属性
- flutter - Flutter Firestore Operator 未定义
- php - 如何排列现有数据并根据其优先级排序
- flutter - 如何合并数组并访问两个数组 Dart 的字段?
- hybris - Smartedit - 用户组无法上传/替换/删除组件的媒体属性而不是管理组的一部分