Pandas - fillna 具有特定类别的平均值
Pandas - fillna with mean for specific categories
我想用该列的平均值填充 na,但仅限于与缺失值属于同一类别的代表
data = {'Class': ['Superlight', 'Aero', 'Aero', 'Superlight', 'Superlight', 'Superlight', 'Aero', 'Aero'],
'Weight': [5.6, 8.6, np.nan, 5.9, 5.65, np.nan, 8.1, 8.4]}
Class Weight
0 Superlight 5.60
1 Aero 8.60
2 Aero NaN
3 Superlight 5.90
4 Superlight 5.65
5 Superlight NaN
6 Aero 8.10
7 Aero 8.40
我知道我能做到:
df.Weight.fillna(df.Weight.mean())
但这将用整列的平均值填充缺失值。
以下将用 AERO 类别的平均值替换空值(这更好,但仍然不好,因为我必须分别为每个 category/class 执行此操作)
df.Weight.fillna(df[df.Class == 'Aero'].Weight.mean())
是否可以对其进行抽象,使其自动获取当前行的 Class 并找到属于该类别的值的平均值并替换它而无需对 Class 进行硬编码价值观?希望这是有道理的。
groupby + transform
然后填写:
df['Weight'].fillna(df.groupby("Class")['Weight'].transform("mean"))
0 5.600000
1 8.600000
2 8.366667
3 5.900000
4 5.650000
5 5.716667
6 8.100000
7 8.400000
Name: Weight, dtype: float64
也许你可以尝试对每个组使用 groupby
和 apply
:
df.groupby('Class')['Weight'].apply(lambda g: g.fillna(g.mean()))
我想用该列的平均值填充 na,但仅限于与缺失值属于同一类别的代表
data = {'Class': ['Superlight', 'Aero', 'Aero', 'Superlight', 'Superlight', 'Superlight', 'Aero', 'Aero'],
'Weight': [5.6, 8.6, np.nan, 5.9, 5.65, np.nan, 8.1, 8.4]}
Class Weight
0 Superlight 5.60
1 Aero 8.60
2 Aero NaN
3 Superlight 5.90
4 Superlight 5.65
5 Superlight NaN
6 Aero 8.10
7 Aero 8.40
我知道我能做到:
df.Weight.fillna(df.Weight.mean())
但这将用整列的平均值填充缺失值。
以下将用 AERO 类别的平均值替换空值(这更好,但仍然不好,因为我必须分别为每个 category/class 执行此操作)
df.Weight.fillna(df[df.Class == 'Aero'].Weight.mean())
是否可以对其进行抽象,使其自动获取当前行的 Class 并找到属于该类别的值的平均值并替换它而无需对 Class 进行硬编码价值观?希望这是有道理的。
groupby + transform
然后填写:
df['Weight'].fillna(df.groupby("Class")['Weight'].transform("mean"))
0 5.600000
1 8.600000
2 8.366667
3 5.900000
4 5.650000
5 5.716667
6 8.100000
7 8.400000
Name: Weight, dtype: float64
也许你可以尝试对每个组使用 groupby
和 apply
:
df.groupby('Class')['Weight'].apply(lambda g: g.fillna(g.mean()))