首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫数据中有缺失值的分组数据计数

熊猫数据中有缺失值的分组数据计数
EN

Stack Overflow用户
提问于 2015-01-25 12:46:29
回答 2查看 1.1K关注 0票数 0

我正在尝试这样做,但在一个更大的数据文件(称为“清洁”)上:

代码语言:javascript
复制
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')时,我会得到一个错误:

代码语言:javascript
复制
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')会产生一个值错误:

代码语言:javascript
复制
ValueError: Cannot convert NA to integer

我看过数据结构,这一切似乎都是一样的。

以下是产生错误的数据:

代码语言:javascript
复制
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

而工作的原始例程会产生这样的结果:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-25 20:25:45

这看上去是对的--我一直在修改groupby,并想出了这个解决方案,这个解决方案看起来更优雅,而且不需要明确地处理na:

代码语言:javascript
复制
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)

这给了我:

代码语言:javascript
复制
       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

我更喜欢这一点,因为我把值保留为值而不是索引,我认为这会使以后的生活更容易绘制。

票数 0
EN

Stack Overflow用户

发布于 2015-01-25 19:20:43

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

代码语言:javascript
复制
Hist.agg(len).dropna()

完整的代码实现如下所示:

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
             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()的行文如下:

代码语言:javascript
复制
             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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28136545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档