计算 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

我更喜欢这个,因为我将值保留为值而不是索引,我认为这会让以后的绘图变得更容易。