Python:当所需的索引系列有重复项时旋转 pandas DataFrame

标签 python pandas pivot dataframe

我有一个 pandas DataFrame my_data ,看起来像

    event_id    user_id    attended
0     13          345         1
1     14          654         0
...

因此 event_iduser_id 都有重复项,因为每个用户和事件组合都有一个条目。我想要做的是将其 reshape 为一个 DataFrame,其中我的索引(行)是 DISTINCT user_id's,列是 DISTINCT event_id's 和中的值给定的 (row, col) 只是他们是否出席的 bool 值 0 或 1。

看起来pivot方法是合适的,但是当然当我尝试my_data.pivot(index='user_id', columns='event_id',values='attended') 我收到索引有重复项的错误。

我想我应该先对user_id进行某种groupby,但我不想将所有参与的人数加起来 1 和 0 代表每个用户,因为我特别想将 event_id 分开作为我的新列,并单独保留每个用户参加的事件。

任何帮助将不胜感激,谢谢!

最佳答案

IIUC,pivot_table 应该给你你想要的:

>>> df = pd.DataFrame({"event_id": np.random.randint(10, 20, 20), "user_id": np.random.randint(100, 110, 20), "attended": np.random.randint(0, 2, 20)})
>>> df.pivot_table(index="user_id", columns="event_id", values="attended", 
    aggfunc=sum).fillna(0)
event_id  10  11  12  13  14  15  16  17  19
user_id                                     
101        0   0   0   1   0   0   0   0   0
103        0   0   0   0   0   0   0   0   0
104        0   0   0   0   0   0   0   0   1
105        0   0   0   0   0   0   0   0   0
106        0   0   0   0   0   0   1   0   0
107        1   0   0   0   0   0   0   1   0
108        0   0   0   1   0   0   0   0   0
109        0   0   0   0   1   0   1   0   0

如前所述,如果多行具有相同的用户/事件组合(可能不是这种情况),则出勤率将被累加。如果您想保证帧仅由 0 和 1 组成,那么可以很容易地使用 any 或剪辑值。

关于Python:当所需的索引系列有重复项时旋转 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29057124/

相关文章:

python - Pandas - 取消堆叠重复项

sql-server - 如何使用每行的总计列来透视查询结果

使用 AMQP (RabbitMQ) 作为 Apache Thrift RPC 传输层的 Python 库

python - 为什么 render_template 给出 404 not find ?

python - Pandas 多层次分组

python - 对 pandas 中的群体进行采样

mysql - 在 SQL 中根据日期组织数据

python - Pandas :将系列的数据类型更改为字符串

python - 同一引用中的成员运算符

python - 创建 pd.date_range 的 pandas 列