我有一个类似于下面的数据框(我的实际数据框大约是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
我在想另一种选择是为我的每个案例创建一个布尔掩码,然后总结每个掩码。
我要问的是,从原始数据帧到摘要数据帧的最简单方法是什么?
答案 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