计算pandas数据帧中缺少值的分组数据

时间:2015-01-25 12:46:30

标签: python pandas group-by

我正在尝试做这样的事情,但是在一个更大的数据框架上(称为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

产生此错误的这些数据集有何不同?

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,我相信你想要的是:

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

答案 1 :(得分:0)

看起来很正确---我一直在修补groupby并想出了这个看似更优雅的解决方案,并且不需要明确地处理这些问题:

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

我更喜欢这个,因为我将值保留为值而不是索引,我认为这将使以后的绘图生活更轻松。