将数据分组并汇总到新的pandas数据帧中

时间:2015-04-24 16:06:31

标签: python pandas

我有一个类似于下面的数据框(我的实际数据框大约是200k行)。每行是唯一用户与原点的距离以及自上次登录以来的时间。

+------------+------------------+
| time_since | dist_from_origin |
+------------+------------------+
|          1 | 0.12             |
|          0 | 71.15            |
|          4 | 74.48            |
|          2 | 19.69            |
|          3 | 0.12             |
|          0 | 132.92           |
|          1 | 174.45           |
|          4 | 0.12             |
|          3 | 81.07            |
|          2 | 65.43            |
|          1 | 162.58           |
|          0 | 0.12             |
|          3 | 0.12             |
|          4 | 20.68            |
|          3 | 109.93           |
|          2 | 100.87           |
|          0 | 131.50           |
|          0 | 132.74           |
|          4 | 181.35           |
|          3 | 150.55           |
+------------+------------------+

我想创建一个新的数据框,汇总数据,如下例所示。如果第1列是非活动天数,则第2列是组中用户(行?)的计数,而后面的每列都是符合该特定条件的距离计数。

+---------------+-----------+-----+-------------+--------------+---------------+----------------+----------------+
| days inactive | num users | <=5 | >5 and <=25 | >25 and <=50 | >50 and <=100 | >100 and <=150 | >150 and <=225 |
+---------------+-----------+-----+-------------+--------------+---------------+----------------+----------------+
|             0 |         5 |   1 |           0 |            0 |             1 |              3 |              0 |
|             1 |         3 |   1 |           0 |            0 |             0 |              0 |              2 |
|             2 |         3 |   0 |           1 |            0 |             1 |              1 |              0 |
|             3 |         5 |   2 |           0 |            0 |             1 |              1 |              1 |
|             4 |         4 |   1 |           1 |            0 |             1 |              0 |              1 |
+---------------+-----------+-----+-------------+--------------+---------------+----------------+----------------+

我尝试通过循环遍历groupby对象中的组来完成摘要数据框,其中对象按time since分组,但是我在创建每个组的摘要并附加到新数据框时遇到了一些困难。

例如。我在第一步中遇到错误:计算每组中的行:

grouped = df.groupby(df['time_since'])

for group in grouped:
    print group['time_since'].count()


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-2182867bdacc> in <module>()
      1 for group in grouped:
----> 2     print group['time_since'].count()

TypeError: tuple indices must be integers, not str

我在想另一种选择是为我的每个案例创建一个布尔掩码,然后总结每个掩码。

我要问的是,从原始数据帧到摘要数据帧的最简单方法是什么?

1 个答案:

答案 0 :(得分:2)

这是一种方法。

创建您的BINS

In [144]: BINS = [0,5,25,50,100,150,225]

然后,分组'time_since'和分组pd.cut(df['dist_from_origin'], BINS)]

In [145]: (df.groupby(['time_since', pd.cut(df['dist_from_origin'], BINS)])
              .size().unstack('dist_from_origin').fillna(0))
Out[145]:
dist_from_origin  (0, 5]  (100, 150]  (150, 225]  (5, 25]  (50, 100]
time_since
0                      1           3           0        0          1
1                      1           0           2        0          0
2                      0           1           0        1          1
3                      2           1           1        0          1
4                      1           0           1        1          1