使用重复的索引值旋转 Pandas 数据框

met*_*rsk 8 python pandas

我有一个数据框,其中包含每个用户加入我的网站并进行购买的行。

+---+-----+--------------------+---------+--------+-----+
|   | 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但我什至不确定这是正确的道路。

sel*_*yth 8

我怀疑确实存在重复的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


fix*_*xer 4

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)

  • 好的 - 所以我升级到 16.0 并且它没有解决问题,但我想我找到了我的问题。我的数据集比我的示例大得多,并且用户有两次销售或两次确认设置时一定存在一些数据错误。我将尝试更好地清理数据,您的解决方案应该有效。 (2认同)