我有一个数据集,其中一列对应分类数据,分别是a, B, C, D和E,所有这些类别都对应测试分数,其中一些分数是NaN值。在这种情况下,我想用成绩的平均值来填补每一个缺失的值。如果我可以使用fillna(),这将会容易得多,但是类别都是关于等级的。
我真的很感激你的帮助。所以我想用某种方式填充这些NaN值,因为它们属于一个组。
如果你有这样的东西
import pandas as pd
import numpy as np
df = pd.DataFrame(
[
[1,'A'],
[2,'B'],
[3,'C'],
[4,np.nan],
[5,'A'],
[6,'B'],
[7,np.nan],
[8,'B'],
[9,'C'],
[10,'D'],
], columns=['id','grade'])
和你的df
id grade
0 1 A
1 2 B
2 3 C
3 4 NaN
4 5 A
5 6 B
6 7 NaN
7 8 B
8 9 C
9 10 D
如果我们正在寻找出现次数最多的
的等级df.groupby('grade').size().to_frame()
可以看到频率应该是
0
grade
A 2
B 3
C 2
D 1
您可以使用mode()
通过
df_mode=df.grade.mode().values[0]
df_mode
则可以用
填充缺失的值df.grade=df.grade.fillna(df_mode)
df
,结果应该是这样的
id grade
0 1 A
1 2 B
2 3 C
3 4 B
4 5 A
5 6 B
6 7 B
7 8 B
8 9 C
9 10 D
如果你想用基于分组分类等级的平均值替换这些值,你可以采用多种方法,但这是一种非常简单的方法:
Grade Score
0 A 95
1 A NaN
2 B NaN
3 B 83
4 B 85
5 B 81
6 C 73
7 C NaN
8 C 75
df.Score = df.groupby("Grade").transform(lambda x: x.fillna(x.mean()))
按分类等级分组,在得分列上迭代,如果是NA,则在该类别的平均值中下降。
这是一个非常简单的方法。