如何将包含缺失数据的数值分组到 bin 中以在 python 中进行计数
How to group numeric values containing missing data into bins for counting in python
我有一系列整数值,数据框(干净)中有缺失数据,我想将它们分到更大的整数组中,然后对这些分箱进行计数(比如生成直方图)。这是一个大型数据集,所以我不想通过删除 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)
但是这个 returns LagBin 值作为一个范围,并且由于我最终想要绘制它,所以我真的希望 bins 是数字的。此外,当我尝试使用 groupby 函数进行计数时(rx 是另一个将在多索引中的分组变量):
Hist=Clean.groupby(level=('rx','LagBin'))
Hist.count('LagBin')
但是这个returns一个错误:
ValueError: Cannot convert NA to integer
所以我想我可以使用简单的转换将滞后值转换为整数 bin:
Clean['LagBin']=Clean.TLag/10
Clean['LagBin']=(int(Clean.LagBin))*10
我还尝试了 hist() 函数——两者都不起作用,产生了这个错误:
TypeError: cannot convert the series to <type 'float'>
这似乎是一个非常简单的练习,应该很简单。我错过了什么?
我认为您的想法或多或少是正确的,并且只是被语法所困扰。例如,我们可以使用除以十乘以十的技巧来添加一个 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 == 0
和 2.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
在函数 pd.cut 中尝试 labels .
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
我有一系列整数值,数据框(干净)中有缺失数据,我想将它们分到更大的整数组中,然后对这些分箱进行计数(比如生成直方图)。这是一个大型数据集,所以我不想通过删除 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)
但是这个 returns LagBin 值作为一个范围,并且由于我最终想要绘制它,所以我真的希望 bins 是数字的。此外,当我尝试使用 groupby 函数进行计数时(rx 是另一个将在多索引中的分组变量):
Hist=Clean.groupby(level=('rx','LagBin'))
Hist.count('LagBin')
但是这个returns一个错误:
ValueError: Cannot convert NA to integer
所以我想我可以使用简单的转换将滞后值转换为整数 bin:
Clean['LagBin']=Clean.TLag/10
Clean['LagBin']=(int(Clean.LagBin))*10
我还尝试了 hist() 函数——两者都不起作用,产生了这个错误:
TypeError: cannot convert the series to <type 'float'>
这似乎是一个非常简单的练习,应该很简单。我错过了什么?
我认为您的想法或多或少是正确的,并且只是被语法所困扰。例如,我们可以使用除以十乘以十的技巧来添加一个 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 == 0
和 2.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
在函数 pd.cut 中尝试 labels .
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