pandas 如何创建一个函数,将空值替换为最常见的值或平均值,基于特定列

hgb9j2n6  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(138)

csv文件包含超过18列,我希望执行数据清理,而不删除具有空值的行。
有些列有字符串,而其他列有浮点和int,所以我想创建一个函数,自动检查某些列的空值,并替换为最出现的值(如果这是基于字符串的列)和平均值为基于int和浮点的列,而不是手动。

|response|score|
|A       |25   |
|A       |     |
|B       |20   |
|C       |15   |
|        |25   |

字符串
我的示例代码

df['response']=df['response'].fillna('A').astype(str)
df['score']=df['score'].fillna(df.score.mean()).astype(float)

cvxl0en2

cvxl0en21#

pandas.api.types.is_numeric_dtype使用自定义函数:

def filler(s):
    if pd.api.types.is_numeric_dtype(s):
        fill_value = s.mean()
    else:                         # add other conditions if needed
        fill_value = s.mode()[0]
    return s.fillna(fill_value)

out = df.apply(filler)

字符串
作为一句俏皮话

out = df.apply(lambda s: s.fillna(s.mean() if pd.api.types.is_numeric_dtype(s)
                                  else s.mode()[0]))


输出量:

response  score
0        A  25.00
1        A  21.25
2        B  20.00
3        C  15.00
4        A  25.00

deikduxw

deikduxw2#

你可以试试这个:

df['score'] = df['score'].fillna(df.groupby('response')['score'].transform('mean'))

字符串
这将用相同“响应”的值的平均值替换空值。
您可以将函数更改为median,max,min -取决于您的用例
如果要对所有列执行此操作:

for col in df.columns:
    df[col] = df[col].fillna(df.groupby('response')[col].transform('mean'))

相关问题