【发布时间】:2015-01-24 18:30:24
【问题描述】:
我有一系列整数值,在数据帧(清洁)中缺少数据,我想将其分箱成更大的整数组,然后对这些分箱进行计数(如生成直方图)。这是一个大型数据集,所以我不想通过删除 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 值转换为整数 bin:
Clean['LagBin']=Clean.TLag/10
Clean['LagBin']=(int(Clean.LagBin))*10
我也尝试了 hist() 函数——两者都不起作用,产生了这个错误:
TypeError: cannot convert the series to <type 'float'>
这似乎是一个非常简单的练习,应该是直截了当的。我错过了什么?
【问题讨论】:
-
我不明白你想要的输出。你的 LagBin 10 组中不应该有 5 个吗? (10,12,14,16,18)。或者,或者,如果您的间隔是封闭的,那么 0 组中有 5 个?
-
我想分箱为 10 个(0,10,20...3600)。最终,这是关于产生一个密度函数,我想对其进行进一步的操作。 10 人组是任意的,我希望能够在场合允许时进行转换。好的,我现在明白了这个问题——所以我想我并不真正关心 10 是否包含在内。通常我通过除以 10 ,取整数,然后将该整数乘以 10 来做到这一点,这样我认为是封闭的,对吧? 10/10 是 1*10 是 10,所以 10 进入下一个 bin。
-
那么鉴于您显示的数据,您的 [4,4,2] 的
Count列不正确? -
叹息。是的。它应该是 4,5,2。我会解决的
-
在我看来,问题似乎出在 NaN 上。我是 SAS 和 Access 用户,并且是 Python 和 R 的新手,我无法将注意力集中在 sql 中直截了当的任务上(我不想在这里使用 sql,主要是因为我正在努力学习,并且数据框是 12百万条记录 X 17 列)
标签: python pandas group-by histogram