我有一个数据框,其中包含每个用户加入我的网站并进行购买的行。
+---+-----+--------------------+---------+--------+-----+
| | uid | msg | _time | gender | age |
+---+-----+--------------------+---------+--------+-----+
| 0 | 1 | confirmed_settings | 1/29/15 | M | 37 |
| 1 | 1 | sale | 4/13/15 | M | 37 |
| 2 | 3 | confirmed_settings | 4/19/15 | M | 35 |
| 3 | 4 | confirmed_settings | 2/21/15 | M | 21 |
| 4 | 5 | confirmed_settings | 3/28/15 | M | 18 |
| 5 | 4 | sale | 3/15/15 | M | 21 |
+---+-----+--------------------+---------+--------+-----+
Run Code Online (Sandbox Code Playgroud)
我想更改数据框,以便每行对于 uid 都是唯一的,并且有一个列被调用sale并且confirmed_settings具有操作的时间戳。请注意,并非每个用户都有一个sale,但每个用户都有一个confirmed_settings。像下面这样:
+---+-----+--------------------+---------+---------+--------+-----+
| | uid | confirmed_settings | sale | _time | gender | age |
+---+-----+--------------------+---------+---------+--------+-----+
| 0 | 1 | 1/29/15 | 4/13/15 | 1/29/15 | M | 37 |
| 1 | 3 | 4/19/15 | null | 4/19/15 | M | 35 |
| 2 | 4 | 2/21/15 | 3/15/15 | 2/21/15 | M | 21 |
| 3 | 5 | 3/28/15 | null | 3/28/15 | M | 18 |
+---+-----+--------------------+---------+---------+--------+-----+
Run Code Online (Sandbox Code Playgroud)
为此,我正在尝试:
df1 = df.pivot(index='uid', columns='msg', values='_time').reset_index()
df1 = df1.merge(df[['uid', 'gender', 'age']].drop_duplicates(), on='uid')
Run Code Online (Sandbox Code Playgroud)
但我收到此错误: ValueError: Index contains duplicate entries, cannot reshape
如何使用重复的索引值旋转 df 以转换我的数据框?
编辑:
df1 = df.pivot_table(index='uid', columns='msg', values='_time').reset_index()
给出了这个错误,DataError: No numeric types to aggregate但我什至不确定这是正确的道路。
我怀疑确实存在重复的uid条目msg/键(例如uid2 在 下有 2 个 recognize_settings 条目msg),您在 fixxxer 的答案的评论中提到了这一点。如果有,则不能使用pivot,因为您无法告诉它如何处理聚合过程中遇到的不同值(count?max?mean?sum?)。请注意,索引错误是生成的数据透视表索引上的错误df1,而不是原始 DataFrame 上的错误df。
pivot_table但是,您可以通过参数来做到这一点aggfunc。像这样的事情怎么样?
df1 = df.pivot_table(index = 'uid', columns = 'msg', values = '_time', aggfunc = len)
Run Code Online (Sandbox Code Playgroud)
这将帮助您找出哪些用户消息记录具有重复条目(任何超过 1 的条目),清除它们后,您可以使用pivotondf成功进行透视_time。
x是您作为输入的数据框:
uid msg _time gender age
0 1 confirmed_settings 1/29/15 M 37
1 1 sale 4/13/15 M 37
2 3 confirmed_settings 4/19/15 M 35
3 4 confirmed_settings 2/21/15 M 21
4 5 confirmed_settings 3/28/15 M 18
5 4 sale 3/15/15 M 21
y = x.pivot(index='uid', columns='msg', values='_time')
x.join(y).drop('msg', axis=1)
Run Code Online (Sandbox Code Playgroud)
给你:
uid _time gender age confirmed_settings sale
0 1 1/29/15 M 37 NaN NaN
1 1 4/13/15 M 37 1/29/15 4/13/15
2 3 4/19/15 M 35 NaN NaN
3 4 2/21/15 M 21 4/19/15 NaN
4 5 3/28/15 M 18 2/21/15 3/15/15
5 4 3/15/15 M 21 3/28/15 NaN
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16901 次 |
| 最近记录: |