簡體   English   中英

在Pandas數據框中計算缺少值的分組數據

[英]Counting grouped data with missing values in pandas dataframe

我正在嘗試做這樣的事情,但是在更大的數據幀(稱為Clean)上:

d={'rx': [1,1,1,1,2.1,2.1,2.1,2.1],
     'vals': [NaN,10,10,20,NaN,10,20,20]}
df=DataFrame(d)


arrays = [df.rx,df.vals]                    
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','vals'])           
df.index = index

Hist=df.groupby(level=('rx','vals'))
Hist.count('vals')

這似乎很好用,但是當我甚至在Clean數據幀的一個子集上運行相同的概念時(用“ LagBin”列替換為“ vals”),我得到一個錯誤:

df1=DataFrame(data=Clean,columns=('rx','LagBin'))
df1=df1.head(n=20)

arrays = [df1.rx,df1.LagBin]                    
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','LagBin'])            
df1.index = index

Hist=df1.groupby(level=('rx','LagBin'))
Hist.count('LagBin')

具體來說,Hist.count('LagBin')會產生值錯誤:

ValueError: Cannot convert NA to integer

我已經看過數據結構,而且看起來似乎完全一樣。

這是產生錯誤的數據:

rx  LagBin  rx  LagBin
139.1  nan  139.1   
139.1  0    139.1   0
139.1  0    139.1   0
139.1  0    139.1   0
141.1  nan  141.1   
141.1  10   141.1   10
141.1  20   141.1   20
193    nan  193 
193    50   193     50
193    20   193     20
193    3600 193     3600
193    50   193     50
193    0    193     0
193    20   193     20
193    10   193     10
193    110  193     110
193    80   193     80
193    460  193     460
193    30   193     30
193    0    193     0

而有效的原始例程會產生以下結果:

rx  vals    rx  vals
1   nan     1   
1   10      1   10
1   10      1   10 
1   20      1   20
2.1 nan     2.1 
2.1 10      2.1 10
2.1 20      2.1 20
2.1 20      2.1 20

這些產生此錯誤的數據集有何不同?

如果我正確理解了您的問題,我相信您想要的是:

Hist.agg(len).dropna()

完整的代碼實現如下所示:

d={'rx': [139.1,139.1,139.1,139.1,141.1,141.1,141.1,193,193,193,193,193,193,193,193,193,193,193,193,193],
     'vals': [nan,0,0,0,nan,10,20,nan,50,20,3600,50,0,20,10,110,80,460,30,0]}
df=pd.DataFrame(d)

arrays = [df.rx,df.vals]                    
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','vals'])           
df.index = index

Hist=df.groupby(level=('rx','vals'))
print(Hist.agg(len).dropna())

df如下所示:

             rx  vals
rx    vals             
139.1 NaN   139.1   NaN
      0     139.1     0
      0     139.1     0
      0     139.1     0
141.1 NaN   141.1   NaN
      10    141.1    10
      20    141.1    20
193.0 NaN   193.0   NaN
      50    193.0    50
      20    193.0    20
      3600  193.0  3600
      50    193.0    50
      0     193.0     0
      20    193.0    20
      10    193.0    10
      110   193.0   110
      80    193.0    80
      460   193.0   460
      30    193.0    30
      0     193.0     0

Hist.agg(len).dropna()看起來像:

             rx  vals
rx    vals          
139.1 0      3     3
141.1 10     1     1
      20     1     1
193.0 0      2     2
      10     1     1
      20     2     2
      30     1     1
      50     2     2
      80     1     1
      110    1     1
      460    1     1
      3600   1     1

看起來不錯-我一直在修改groupby並提出了這個解決方案,它看起來更優雅,並且不需要顯式處理na:

df1=DataFrame(data=Clean,columns=('rx','LagBin'))
df1=df1.head(n=20)

df1["rx"].groupby((df1["rx"],df1["LagBin"])).count().reset_index(name="Count")
print(LagCount)

這給了我:

       rx  LagBin  Count
0   139.1       0      3
1   141.1      10      1
2   141.1      20      1
3   193.0       0      2
4   193.0      10      1
5   193.0      20      2
6   193.0      30      1
7   193.0      50      2
8   193.0      80      1
9   193.0     110      1
10  193.0     460      1
11  193.0    3600      1

我更喜歡這種方式,因為我將值保留為值而不是索引,我認為這樣會使以后的繪制工作變得更輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM