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

如何将包含缺失数据的数值分组到容器中,以便在python中进行计数,python,pandas,group-by,histogram,Python,Pandas,Group By,Histogram,我有一系列的整数值,在一个数据帧清理中丢失了数据,我想把这些数据存储到更大的整数组中,然后像生成直方图一样对这些数据进行计数。这是一个很大的数据集,所以我不想通过删除NAN来划分子集。我有这个: TLag NaN 2 4 6 8 10 12 14 16 18 20 22 我想要这个: LagBin Count 0 4 10 5 20 2 我试着使用pd切割: tbins=np.arange(0,3600,10) Clean['LagBin']=pd.cut(

我有一系列的整数值,在一个数据帧清理中丢失了数据,我想把这些数据存储到更大的整数组中,然后像生成直方图一样对这些数据进行计数。这是一个很大的数据集,所以我不想通过删除NAN来划分子集。我有这个:

TLag
NaN
2
4
6
8
10
12
14
16
18
20
22
我想要这个:

LagBin  Count
0       4
10      5
20      2
我试着使用pd切割:

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值,因为我最终想要绘制它,所以我真的希望箱子是数值的。此外,当我尝试使用groupby函数rx进行计数时,另一个分组变量将出现在multiindex中:

Hist=Clean.groupby(level=('rx','LagBin'))
Hist.count('LagBin')
但这会返回一个错误:

ValueError: Cannot convert NA to integer 
所以我想我可以通过一个简单的转换将滞后值转换成整数:

Clean['LagBin']=Clean.TLag/10
Clean['LagBin']=(int(Clean.LagBin))*10
我还尝试了hist函数,但两个函数都不起作用,因此产生了以下错误:

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

这似乎是一个非常简单的练习,应该很简单。我遗漏了什么?

我认为你的想法或多或少是正确的,只是在语法方面有所欠缺。例如,我们可以使用“除以十乘以十”的技巧来添加一个LagBin列,然后使用groupby计数:

请注意,我使用//来截断除法,因此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中的标签

输出为:

Out[136]: 
0     5
10    5
20    4

我不明白你想要的结果。你的拉宾10组不是应该有5个吗?10,12,14,16,18. 或者,如果你的时间间隔是闭合的,在0组中为5?我想把你的时间间隔分为10 0,10,20…3600个时间间隔。最终,这是关于产生一个密度函数,我想对它做进一步的操作。10号组是任意的,我希望能够在必要时改变。好吧,我现在明白这个问题了,所以我想我并不真正关心10是否包含在内。通常我是通过除以10,取整数,然后乘以10,这样我认为是闭合的,对吗?10/10是1*10是10,所以10会进入下一个箱子。鉴于您显示的数据,[4,4,2]的计数列不正确?叹气。对应该是4,5,2。我会解决的,因为我认为问题似乎与南的。我是一名SAS和Access用户,不熟悉Python和R,我很难将注意力集中在sql中严格要求的任务上。我不想在这里使用sql,主要是因为我正在努力学习,数据帧是1200万条记录X 17列。第一个解决方案工作得很好。我不明白.reset_索引的目的。你能澄清一下吗?当我运行它时,它会抛出一个错误…我的实际代码更复杂,数据帧已经包含了一个多索引。是否需要将LagBin添加到多索引中?在第二个示例中,如果没有as_index=False,则组键在本例中,这些BIN将用作结果数据帧的索引。我希望将该索引提升回实际列,并为结果列提供名称计数。有关多索引的更多信息:TLag来自不同的接收者fieldname“rx”,我真的希望按rx分组。这就是我输入的:Clean['LagBin']=Clean.TLag//10*10数组=[Clean.rx,Clean.LagBin]定义数组对象,它包含多索引index=pd.MultiIndex.from_arraysarray,name=['rx','LagBin']声明多级索引为干净。索引=index@TheodoreCastro-桑托斯:你在这里还是比较新的:-所以我应该提醒你,评论部分并不是我们处理后续问题的方式。如果您有一个单独的问题,请形成一个小示例,人们可以复制并粘贴该示例以使用示例输入和所需输出进行测试,然后打开一个新问题。另外,更多的人会这么看。谢谢你的提示。但这是一个后续…那么我是否要将此作为编辑添加到原始帖子中?
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