对于另一列 Y 中的每个分类变量,用 X 的中值填充 X 列的 NaN 值
Fill NaN values of column X with the median value of X for each categorial variable in another column Y
这很难说。但是让我告诉你我想要完成的事情。
df
Y X
a 10
a 5
a NaN
b 12
b 13
b NaN
c 5
c NaN
c 5
c 6
Y: 10 non-null object
X: 7 non-null int64
从Y列中取出类别'a',它的X值中位数为(10+5/2),'a'的另一个缺失值必须用这个中值填充。
类似地,对于 Y 列的类别 'b',在 X 列的非缺失值中,X 值的中位数为 (12+13/2)
对于 Y 列的类别 'c',在 X 列的非缺失值中,X 值的中位数为 5(中间值)
我用了一段很长的重复代码如下
grouped = df.groupby(['Y'])[['X']]
grouped.agg([np.median])
X
median
Y
a 7.5
b 12.5
c 5
df.X = df.X.fillna(-1)
df.loc[(df['Y'] == 'a') & (df['X'] == -1), 'X'] = 7.5
df.loc[(df['Y'] == 'b') & (df['X'] == -1), 'X'] = 12.5
df.loc[(df['Y'] == 'c') & (df['X'] == -1), 'X'] = 5
有人告诉我,不仅有重复,还有幻数的使用,应该避免。
我想编写一个函数来高效地进行填充。
使用groupby
和transform
变换看起来像
df.groupby('Y').X.transform('median')
0 7.5
1 7.5
2 7.5
3 12.5
4 12.5
5 12.5
6 5.0
7 5.0
8 5.0
9 5.0
Name: X, dtype: float64
这与之前的索引相同。因此我们可以很容易地使用它来 fillna
df.X.fillna(df.groupby('Y').X.transform('median'))
0 10.0
1 5.0
2 7.5
3 12.0
4 13.0
5 12.5
6 5.0
7 5.0
8 5.0
9 6.0
Name: X, dtype: float64
您可以制作数据框的新副本
df.assign(X=df.X.fillna(df.groupby('Y').X.transform('median')))
Y X
0 a 10.0
1 a 5.0
2 a 7.5
3 b 12.0
4 b 13.0
5 b 12.5
6 c 5.0
7 c 5.0
8 c 5.0
9 c 6.0
或fillna
值到位
df.X.fillna(df.groupby('Y').X.transform('median'), inplace=True)
df
Y X
0 a 10.0
1 a 5.0
2 a 7.5
3 b 12.0
4 b 13.0
5 b 12.5
6 c 5.0
7 c 5.0
8 c 5.0
9 c 6.0
这很难说。但是让我告诉你我想要完成的事情。
df
Y X
a 10
a 5
a NaN
b 12
b 13
b NaN
c 5
c NaN
c 5
c 6
Y: 10 non-null object
X: 7 non-null int64
从Y列中取出类别'a',它的X值中位数为(10+5/2),'a'的另一个缺失值必须用这个中值填充。
类似地,对于 Y 列的类别 'b',在 X 列的非缺失值中,X 值的中位数为 (12+13/2)
对于 Y 列的类别 'c',在 X 列的非缺失值中,X 值的中位数为 5(中间值)
我用了一段很长的重复代码如下
grouped = df.groupby(['Y'])[['X']]
grouped.agg([np.median])
X
median
Y
a 7.5
b 12.5
c 5
df.X = df.X.fillna(-1)
df.loc[(df['Y'] == 'a') & (df['X'] == -1), 'X'] = 7.5
df.loc[(df['Y'] == 'b') & (df['X'] == -1), 'X'] = 12.5
df.loc[(df['Y'] == 'c') & (df['X'] == -1), 'X'] = 5
有人告诉我,不仅有重复,还有幻数的使用,应该避免。
我想编写一个函数来高效地进行填充。
使用groupby
和transform
变换看起来像
df.groupby('Y').X.transform('median')
0 7.5
1 7.5
2 7.5
3 12.5
4 12.5
5 12.5
6 5.0
7 5.0
8 5.0
9 5.0
Name: X, dtype: float64
这与之前的索引相同。因此我们可以很容易地使用它来 fillna
df.X.fillna(df.groupby('Y').X.transform('median'))
0 10.0
1 5.0
2 7.5
3 12.0
4 13.0
5 12.5
6 5.0
7 5.0
8 5.0
9 6.0
Name: X, dtype: float64
您可以制作数据框的新副本
df.assign(X=df.X.fillna(df.groupby('Y').X.transform('median')))
Y X
0 a 10.0
1 a 5.0
2 a 7.5
3 b 12.0
4 b 13.0
5 b 12.5
6 c 5.0
7 c 5.0
8 c 5.0
9 c 6.0
或fillna
值到位
df.X.fillna(df.groupby('Y').X.transform('median'), inplace=True)
df
Y X
0 a 10.0
1 a 5.0
2 a 7.5
3 b 12.0
4 b 13.0
5 b 12.5
6 c 5.0
7 c 5.0
8 c 5.0
9 c 6.0