[英]Pandas Standard Deviation returns NaN
我在 Python 2.7 中有以下 Pandas Dataframe。
代碼:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,6),columns=list('ABCDEF'))
df.insert(0,'Category',['A','C','D','D','B','E','F','F','G','H'])
print df.groupby('Category').std()
這是df
:
Category A B C D E F
A 0.500200 0.791039 0.498083 0.360320 0.965992 0.537068
C 0.295330 0.638823 0.133570 0.272600 0.647285 0.737942
D 0.912966 0.051288 0.055766 0.906490 0.078384 0.928538
D 0.416582 0.441684 0.605967 0.516580 0.458814 0.823692
B 0.714371 0.636975 0.153347 0.936872 0.000649 0.692558
E 0.639271 0.486151 0.860172 0.870838 0.831571 0.404813
F 0.375279 0.555228 0.020599 0.120947 0.896505 0.424233
F 0.952112 0.299520 0.150623 0.341139 0.186734 0.807519
G 0.384157 0.858391 0.278563 0.677627 0.998458 0.829019
H 0.109465 0.085861 0.440557 0.925500 0.767791 0.626924
我希望執行GROUP_BY
,然后計算平均值和標准偏差。 有時在對 1 行進行分組后計算標准偏差 - 這意味着除以N-1
有時會給出除以0
,這將打印NaN
。
下面是上面代碼的輸出:
輸出:
A B C D E F
Category
A NaN NaN NaN NaN NaN NaN
B NaN NaN NaN NaN NaN NaN
C NaN NaN NaN NaN NaN NaN
D 0.350996 0.276052 0.389051 0.275708 0.269004 0.074137
E NaN NaN NaN NaN NaN NaN
F 0.407882 0.180813 0.091941 0.155699 0.501884 0.271025
G NaN NaN NaN NaN NaN NaN
H NaN NaN NaN NaN NaN NaN
對於我在 1 行上執行GROUP_BY
的情況,有沒有辦法跳過標准偏差並只返回值本身。 例如,我希望得到這個:
期望的輸出
A B C D E F
Category
A 0.500200 0.791039 0.498083 0.360320 0.965992 0.537068
B 0.714371 0.636975 0.153347 0.936872 0.000649 0.692558
C 0.295330 0.638823 0.133570 0.272600 0.647285 0.737942
D 0.350996 0.276052 0.389051 0.275708 0.269004 0.074137
E 0.639271 0.486151 0.860172 0.870838 0.831571 0.404813
F 0.407882 0.180813 0.091941 0.155699 0.501884 0.271025
G 0.384157 0.858391 0.278563 0.677627 0.998458 0.829019
H 0.109465 0.085861 0.440557 0.925500 0.767791 0.626924
可以用 Pandas 做到這一點嗎?
編輯:要創建上面的確切 Pandas 數據框,請選擇它,復制到剪貼板,然后使用:
import pandas as pd
df = pd.read_clipboard(index_col='Category')
print df
print df.groupby('Category').std()
不完全是問題中提出的問題,但如果您想避免NaN
值,請計算總體標准偏差,用std(ddof=0)
指定:
>>> print(df.groupby('Category').std(ddof=0))
A B C D E F
Category
A 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
B 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
D 0.248192 0.195198 0.275101 0.194955 0.190215 0.052423
E 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
F 0.288417 0.127854 0.065012 0.110096 0.354885 0.191643
G 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
H 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
請注意ddof
(Delta 自由度)的不同默認值:
DataFrame.std
的樣本標准差默認為ddof=1
(除數: N − 1)numpy.std
的總體標准偏差默認為ddof=0
(除數: N )您可以fillna
來替換缺失值 - 使用每個組的最后一個值傳入DataFrame
。
In [86]: (df.groupby('Category').std()
...: .fillna(df.groupby('Category').last()))
Out[86]:
A B C D E F
Category
A 0.500200 0.791039 0.498083 0.360320 0.965992 0.537068
B 0.714371 0.636975 0.153347 0.936872 0.000649 0.692558
C 0.295330 0.638823 0.133570 0.272600 0.647285 0.737942
D 0.350996 0.276052 0.389051 0.275708 0.269005 0.074137
E 0.639271 0.486151 0.860172 0.870838 0.831571 0.404813
F 0.407883 0.180813 0.091941 0.155699 0.501884 0.271024
G 0.384157 0.858391 0.278563 0.677627 0.998458 0.829019
H 0.109465 0.085861 0.440557 0.925500 0.767791 0.626924
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.