如何使用计算将数据帧行分区到bin中

时间:2015-07-23 04:17:08

标签: python pandas

我有一个像

这样的数据框
RecyclerViewAdapter

我想分区为[(1,3),(3,5),(5,7),(7,9),(9,11)](左行包含,右行)独家)。对于每个组,我想获得进入bin的行数,以及每组中1的部分。

结果应该是另一个数据框,如

ParentObject

我该怎么做?

1 个答案:

答案 0 :(得分:3)

您可以执行类似

的操作
bin_edges = [1,3,5,7,9,11]
bins = pd.cut(df.x, bin_edges, right=False)

df_new = pd.DataFrame({"LB": bin_edges[:-1], "RB": bin_edges[1:]})
binned = df.groupby(bins.values.codes)["y"]
df_new["N"] = binned.count()
df_new["N"] = df_new["N"].fillna(0)
df_new["Pcnt1"] = binned.mean()

给出了

>>> df_new
   LB  RB  N     Pcnt1
0   1   3  2  0.500000
1   3   5  1  1.000000
2   5   7  0       NaN
3   7   9  3  0.666667
4   9  11  1  1.000000

(这使用RB专用约定。)

这里所有艰苦的工作都由pd.cut完成,它返回一系列类别dtype:

>>> bins
0     [1, 3)
1     [1, 3)
2     [3, 5)
3     [7, 9)
4     [7, 9)
5     [7, 9)
6    [9, 11)
Name: x, dtype: category
Categories (5, object): [[1, 3) < [3, 5) < [5, 7) < [7, 9) < [9, 11)]

由于我们想要在边界上对齐,我下降到底层的bin索引:

>>> bins.values.codes
array([0, 0, 1, 3, 3, 3, 4], dtype=int8)

请注意,如果我们有一个不适合bin的元素,比如100,那么分类将给出NaN和代码-1,因此当我们插入{{时,它将被正确地跳过1}}。