python - 将 groupby 变成带有新列的单行
问题描述
我希望能够将 groupby 转换为单行,但是如果没有足够的数据,该 groupby 中第二列的值将被聚合到新列或 -99 中。
在我们使用此输入按 session_id 分组后:
user_id session_id timestamp step impressions n_clicks
0 004A07DM0IDW 1d688ec168932 1541555799 7 2059240 5.0
1 004A07DM0IDW 1d688ec168932 1541555799 7 2033381 3.0
2 004A07DM0IDW 1d688ec168932 1541555799 7 1724779 4.0
3 004A07DM0IDW 1d688ec168932 1541555799 7 127131 2.0
4 004A07DM0IDW 1d688ec168932 1541555799 7 399441 1.0
5 004A07DM0IDW 1d688ec168932 1541555799 7 103357 3.0
6 004A07DM0IDW 1d688ec168932 1541555799 7 127132 3.0
7 004A07DM0IDW 1d688ec168932 1541555799 7 1167004 1.0
8 004A07DM0IDW 1d688ec168932 1541555799 7 4491766 4.0
9 004A07DM0IDW 1d688ec168932 1541555799 7 2249874 5.0
10 00Y1Z24X8084 26b6d294d66e7 1541651823 3 4476010 4.0
11 00Y1Z24X8084 26b6d294d66e7 1541651823 3 3843244 5.0
我想产生这个输出
user_id session_id timestamp step count_0 count_1 count_2 count... count_24
0 004A07DM0IDW 1d688ec168932 1541555799 7 5.0 3.0 4.0 2.0 -99
1 00Y1Z24X8084 26b6d294d66e7 1541555799 3 4.0 5.0 -99 -99 -99
我们正在寻找的是user_id
session_id
timestamp
step
每一行的 总是相同的。然而,印象是不同的。对于每一行(最多 25 行),click 列中的值映射到 a count_x
,但是,如果行数不足,则后续值将采用 -99。
由于第一个 groupby 帧中有 10 行,这意味着列count_10
将count_24
具有 -99 作为值。对于第二个 groupby 框架count_2
列count_24
具有 -99。
解决方案
利用:
cols = ['user_id','session_id','timestamp','step']
df['g'] = df.groupby(cols).cumcount()
df = (df.set_index(cols + ['g'])['n_clicks']
.unstack(fill_value=-99)
.reindex(range(25), fill_value=-99, axis=1)
.add_prefix('count_')
.reset_index()
.rename_axis(None, axis=1))
print (df)
user_id session_id timestamp step count_0 count_1 count_2 \
0 004A07DM0IDW 1d688ec168932 1541555799 7 5.0 3.0 4.0
1 00Y1Z24X8084 26b6d294d66e7 1541651823 3 4.0 5.0 -99.0
count_3 count_4 count_5 ... count_15 count_16 count_17 count_18 \
0 2.0 1.0 3.0 ... -99 -99 -99 -99
1 -99.0 -99.0 -99.0 ... -99 -99 -99 -99
count_19 count_20 count_21 count_22 count_23 count_24
0 -99 -99 -99 -99 -99 -99
1 -99 -99 -99 -99 -99 -99
[2 rows x 29 columns]
说明:
GroupBy.cumcount
为计数器创建列- 创建 MultiIndex
DataFrame.set_index
并重塑Series.unstack
range(25)
按by添加缺失的列DataFrame.reindex
- 重命名列名
DataFrame.add_prefix
- 最后一次清洁 -
DataFrame.rename_axis
与DataFrame.reset_index
推荐阅读
- sql-server - SQL 语法计算多个餐单 ID 中每个餐单 ID 的总菜单项
- android - 基于 mediarecorder 的 Camera2 应用程序录制低质量的视频。有人知道为什么吗?
- python - 在 Python 中将连接日期更改为日期时间
- php - Laravel 显示错误 App\Http\Controllers\UserController::admin_side_update() 的参数太少,通过了 1 个,预期正好有 2 个
- php - PhpStorm 代码检查允许在没有类型的对象上调用方法
- regex - Conditionals and regex doubts with grok filter in logstash
- json - Kafka Connect,获取 JsonConverter 的 Json Schema
- svg - 如何为 SVG 根元素设置渐变背景颜色?
- google-sheets - 如何在列表的最后一项下方添加一行
- c - 如何使用 SIMD 计算字符出现次数