Pandas透视表将多行转置为列

3
我可以帮您翻译,以下是翻译的结果:

我有一个结构化如下的pandas数据框:

+---------------+---------------------------+--------+
|     Email     |          Paid at          |  Name  |
+---------------+---------------------------+--------+
| john@mail.com | 2019-11-20 12:23:06 +0100 | #10710 |
| ed@mail.com   | 2019-11-20 11:36:24 +0100 | #10709 |
| john@mail.com | 2019-11-19 14:58:41 +0100 | #10700 |
| ed@mail.com   | 2019-11-19 14:41:30 +0100 | #10699 |
| dev@mail.com  | 2019-11-19 14:20:26 +0100 | #10697 |
+---------------+---------------------------+--------+

我的最终目标是以以下格式汇总一个用户进行的所有交易:
+---------------+---------------------------+--------+---------------------------+--------+--+
|     Email     |          Paid at          |  Name  |          Paid at          |  Name  |  |
+---------------+---------------------------+--------+---------------------------+--------+--+
| john@mail.com | 2019-11-20 12:23:06 +0100 | #10710 | 2019-11-19 14:58:41 +0100 | #10700 |  |
| ed@mail.com   | 2019-11-20 11:36:24 +0100 | #10709 | 2019-11-19 14:41:30 +0100 | #10699 |  |
| dev@mail.com  | 2019-11-19 14:20:26 +0100 | #10697 |                           |        |  |
+---------------+---------------------------+--------+---------------------------+--------+--+

我的起始数据框架是这样构建的:

df = pd.DataFrame({'Email':['john@mail.com', 'ed@mail.com', 
                       'john@mail.com', 'ed@mail.com', 'dev@mail.com'],
             'Paid at':['2019-11-20 12:23:06 +0100', 
                        '2019-11-20 11:36:24 +0100', 
                        '2019-11-19 14:58:41 +0100', 
                        '2019-11-19 14:41:30 +0100',
                       '2019-11-19 14:20:26 +0100'],
             'Name':['#10710', '#10709', '#10700', '#10699', '#10697']})

我尝试使用数据透视功能 df.pivot(index='Email', columns='Name', values='Paid at'),得到了一个数据框,其中每个时间戳都是一列,索引为电子邮件;但我不知道如何创建我想要的列。


标记链接 Q10. - BENY
@WeNYoBen 还是重复的吗?你将它标记为一个关于pandas中数据透视表的问题的重复。但是解决方案根本没有包含数据透视表。你为什么这样做呢? - sanna
这仍然是一个重复的问题,请尝试查看我分享的整个链接,你的问题可以通过q10 + q11来解决。 - BENY
1个回答

1

使用:

#convert column to datetimes
df['Paid at'] = pd.to_datetime(df['Paid at'])
#descending sorting by datetimes
df = df.sort_values('Paid at', ascending=False)
#create MultiIndex by counter with cumcount, reshape by unstack, change order of columns
df = (df.set_index(['Email', df.groupby('Email', sort=False).cumcount()])
        .unstack()
        .sort_index(axis=1, level=[1,0], ascending=[True, False]))
#flatten MultIndex in columns
df.columns = df.columns.map('{0[0]}_{0[1]}'.format)
#convert index to column
df = df.reset_index()
print (df)

谢谢,这确实是一种不错的方法。然而,可能会出现一个事务发生超过2次的情况,所以最终的数据框也应该“捕获”这个情况。如何修改呢? - sanna
@sanna - 不确定是否理解,能否创建示例数据以便查看? - jezrael
df = pd.DataFrame({'Email':['john@mail.com', 'ed@mail.com', 'john@mail.com', 'ed@mail.com', 'dev@mail.com', 'ed@mail.com'], 'Paid at':['2019-11-20 12:23:06 +0100', '2019-11-20 11:36:24 +0100', '2019-11-19 14:58:41 +0100', '2019-11-19 14:41:30 +0100', '2019-11-19 14:20:26 +0100', '2019-11-14 20:13:02 +0100'], 'Name':['#10710', '#10709', '#10700', '#10699', '#10697', '#10623']}) - sanna
1
让我们在聊天中继续这个讨论。 - sanna
@sanna - 超棒,希望我的解决方案能够很好地工作。如果它适合你,请不要忘记接受答案! :) - jezrael
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接