如何将包含缺失数据的数值分组到bin中以便在python中进行计数

时间:2015-01-24 18:30:25

标签: python pandas group-by histogram

我有一系列整数值,在数据框(Clean)中缺少数据,我想将其分成更大的整数组,然后计算这些二进制数(如生成直方图)。它是一个大型数据集,因此我不想通过删除NaN来进行子集化。我有这个:

TLag
NaN
2
4
6
8
10
12
14
16
18
20
22

我想要这个:

LagBin  Count
0       4
10      5
20      2

我尝试使用pd.cut:

tbins=np.arange(0,3600,10)
Clean['LagBin']=pd.cut(Clean['TLag'],bins=tbins,right=True, labels=None,           retbins=False, precision=0, include_lowest=True)

但是这会将LagBin值作为范围返回,因为我最终想要绘制这个,所以我真的希望这些bin是数字的。此外,当我尝试使用groupby函数计数时(rx是另一个将在多索引中的分组变量):

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

但这会返回错误:

ValueError: Cannot convert NA to integer 

所以我想我可以使用简单的转换将Lag值转换为整数二进制位:

Clean['LagBin']=Clean.TLag/10
Clean['LagBin']=(int(Clean.LagBin))*10

我也试过了hist()函数 - 两者都不起作用,产生了这个错误:

TypeError: cannot convert the series to <type 'float'> 

这似乎是一项非常简单的练习,应该是直截了当的。我错过了什么?

2 个答案:

答案 0 :(得分:0)

我认为你或多或少都有正确的想法,并且只是被语法所吸引。例如,我们可以使用十分乘以十分的技巧来添加LagBin列,然后添加groupby - count

In [21]: Clean["LagBin"] = (Clean["TLag"]//10)*10

In [22]: Clean
Out[22]: 
    TLag  LagBin
0    NaN     NaN
1      2       0
2      4       0
3      6       0
4      8       0
5     10      10
6     12      10
7     14      10
8     16      10
9     18      10
10    20      20
11    22      20

In [23]: Clean.groupby("LagBin", as_index=False).count()
Out[23]: 
   LagBin  TLag
0       0     4
1      10     5
2      20     2

请注意,我已使用//截断分割,以便同时2//10 == 02.0//10 == 0(而不是0.2)。

如果您希望更接近所需的输出,可以在那里重命名TLag或将列本身分组:

In [46]: Clean["TLag"].groupby(Clean["LagBin"]).count().reset_index(name="Count")
Out[46]: 
   LagBin  Count
0       0      4
1      10      5
2      20      2

答案 1 :(得分:0)

pd.cut 函数中尝试标签

tlag = np.arange(0, 30, 2)
tbins = np.arange(0, 100, 10)
pd.value_counts(np.cut(tlag, tbins, labels = tbins[:-1]))

输出是:

Out[136]: 
0     5
10    5
20    4