Странное поведение при использовании лямбда-функции в групповом панде - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть панда DataFrame с двумя группами 'A' и 'B', и в каждой группе отсутствует один элемент.

df4 = pd.DataFrame({'Name' : ['A', 'A', 'A', 'A', 'B', 'B', 'B'], 
                    'X' : [0, 0.5,1, np.nan, 1,np.nan,1]})

Name    X
A       0.0
A       0.5
A       1.0
A       nan
B       1.0
B       nan
B       1.0

Я хотел бы использовать лямбда-функцию длязаполните недостающие данные для каждой группы

Правильное поведение при использовании x.mean()

df4.groupby('Name')['X'].transform(lambda x: x.fillna(x.mean()))
0    0.0
1    0.5
2    1.0
3    0.5 <------ Filled as 0.5
4    1.0
5    1.0 <------ Filled as 1
6    1.0

Если я использую x.mean(), как показано выше, поведение правильное, так как в группе A,среднее значение составляет 1.5/3, что составляет 0.5.То же самое относится и к группе B.

Странное поведение при использовании x.std()

Однако, если я использую x.std(), заполненное число не имеет смысла для меня.Для группы A существует только три существующих элемента, 0, 0.5 и 1.0, и их стандартное отклонение должно составлять 0.408.Тем не менее, лямбда-функция дает мне следующий вывод:

df4.groupby('Name')['X'].transform(lambda x: x.fillna(x.std()))
0    0.0
1    0.5
2    1.0
3    0.5 <------ Filled as 0.5 instead of 0.4082
4    1.0
5    0.0 <------ Correct
6    1.0 

Может кто-нибудь объяснить поведение?Откуда взялась эта 0,5?

1 Ответ

0 голосов
/ 27 сентября 2018

Необходимо изменить параметр по умолчанию pandas.Series.std ddof=1 на ddof=0:

print (df4.groupby('Name')['X'].transform(lambda x: x.fillna(x.std(ddof=0))))
0    0.000000
1    0.500000
2    1.000000
3    0.408248
4    1.000000
5    0.000000
6    1.000000
Name: X, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...