[英]How to use aggregate functions in Pandas with missing values
我是熊猫的新手,正在尝试Titanic数据集。 使用groupby函数后,如果我应用mean()
,那么它将正常工作。 但是当我计算std()
,我得到的是NaN
。 我了解到,默认情况下,mean排除了丢失的值,并且不考虑它们,但std将其考虑在内。
我尝试更改ddof=1
和skipna=True
但它们不适用于groupby。 请帮忙。 我的代码中的标题是使用功能工程从名称派生的。 我正在尝试根据指定组中所有乘客年龄的均值和标准差预测年龄的缺失值(就像船长的平均年龄要短些。因此,船长的缺失年龄将仅根据通过groupby功能掌握)
std = train_df.groupby(['Title'])['Age'].std()
print(std)
mean = train_df.groupby(['Title'])['Age'].mean()
print(mean)
Output for sd
Title
Capt NaN
Col 2.828427
Don NaN
Dr 19.295941
Jonkheer NaN
Lady NaN
Major 4.949747
Master 3.792621
Miss 14.525089
Mlle 0.000000
Mme NaN
Mr 17.604569
Mrs 16.292678
Ms NaN
Rev 13.136463
Sir NaN
the Countess NaN
Output for mean
Title
Capt 70.000000
Col 58.000000
Don 40.000000
Dr 36.000000
Jonkheer 38.000000
Lady 48.000000
Major 48.500000
Master 4.025000
Miss 17.450549
Mlle 24.000000
Mme 24.000000
Mr 24.903288
Mrs 31.016000
Ms 28.000000
Rev 43.166667
Sir 49.000000
the Countess 33.000000
DATAFRAME
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Embarked Title
0 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 S Mr
1 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C Mrs
2 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 S Miss
3 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 S Mrs
4 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 S Mr
标准差的计算公式为sqrt(sum((xx.mean())**2)/(n-ddof))
,其中n
是序列的长度, ddof
是均值自由度。 从文档 :
在标准的统计实践中,ddof = 1提供了无穷总体方差的无偏估计量。 ddof = 0为正态分布变量提供方差的最大似然估计。
请注意, 默认值 ddof
为1
的大熊猫 ,但0
在numpy的 。 ddof为1时,由于除以零,只有一个条目的组将获得NaN:
df.groupby(['Title'])['Age'].agg(['count','std'])
count std
Title
Capt 1 NaN
Col 2 2.828427
Don 1 NaN
Dr 6 12.016655
Jonkheer 1 NaN
Lady 1 NaN
Major 2 4.949747
Master 36 3.619872
Miss 146 12.990292
Mlle 2 0.000000
Mme 1 NaN
Mr 398 12.708793
Mrs 108 11.433628
Ms 1 NaN
Rev 6 13.136463
Sir 1 NaN
the Countess 1 NaN
如果您想要std
的ddof
为0
,则可ddof=0
熊猫函数指定ddof=0
,或者使用numpy函数的ddof
默认值为0
:
df.groupby(['Title'])['Age'].std(ddof=0)
df.groupby(['Title'])['Age'].agg(lambda x: pd.np.std(x))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.