为了账号安全,请及时绑定邮箱和手机立即绑定

当每组有多个值时,将 Pandas 数据框列从长转换为宽

当每组有多个值时,将 Pandas 数据框列从长转换为宽

宝慕林4294392 2021-12-29 19:26:51
我有以下格式的数据框:df = pd.DataFrame({'Date': np.repeat(['20190101', '20190102'], 8),                     'Category': list(np.repeat(['A', 'B'], 4))*2,                     'Sub-Category': list(np.repeat(['X', 'Y'], 2))*4,                     'Samples': range(16)})# print(df)        Date Category Sub-Category  Samples0   20190101        A            X        01   20190101        A            X        12   20190101        A            Y        23   20190101        A            Y        34   20190101        B            X        45   20190101        B            X        56   20190101        B            Y        67   20190101        B            Y        78   20190102        A            X        89   20190102        A            X        910  20190102        A            Y       1011  20190102        A            Y       1112  20190102        B            X       1213  20190102        B            X       1314  20190102        B            Y       1415  20190102        B            Y       15在每个日期内,有一个类别,在每个类别内有多个子类别。此外,每个子类别都有多个样本。我想要做的是将“子类别”列从长格式转换为宽格式,而不像这样跨样本进行任何聚合:desired_df = pd.DataFrame({'Date': np.repeat(['20190101', '20190102'], 4),                           'Category': list(np.repeat(['A', 'B'], 2))*2,                           'X': [0, 1, 4, 5, 8, 9, 12, 13],                           'Y': [2, 3, 6, 7, 10, 11, 14, 15]                           })# print(desired_df)       Date Category   X   Y0  20190101        A   0   21  20190101        A   1   32  20190101        B   4   63  20190101        B   5   74  20190102        A   8  105  20190102        A   9  116  20190102        B  12  147  20190102        B  13  15 我想我已经找到了一种方法来实现这一点,但感觉很丑陋和 hacky:它涉及首先为样本编号创建一个新列,然后创建一个将所有这些信息组合在一起的新索引,旋转,然后分离一切又出来了我的问题:有没有更好、更有效的方法来解决这个问题?
查看完整描述

1 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

首先我们使用groupby cumcount创建附加密钥,然后它更像是pivot问题


df['New']=df.groupby(['Date','Category','Sub-Category']).cumcount()

yourdf=df.pivot_table(values='Samples',index=['Date','Category','New'],columns='Sub-Category').reset_index()

yourdf

Out[703]: 

Sub-Category      Date Category  New   X   Y

0             20190101        A    0   0   2

1             20190101        A    1   1   3

2             20190101        B    0   4   6

3             20190101        B    1   5   7

4             20190102        A    0   8  10

5             20190102        A    1   9  11

6             20190102        B    0  12  14

7             20190102        B    1  13  15


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号