pivot_table vs groupby:列名

2024-04-24 21:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

数据层

device_id   month_id    net_grp     watch_hours class
843         201707      TCH         0.250277    Ser
896         201803      NJV         0.820833    Ser
748         201711      SHX         2.461111    Sr
115         201712      SPE         1.478055    Opter
107         201802      US          2.575555    Opter
249         201710      ECC         3.869166    Ser
786         201711      NCK         0.563888    Opter
183         201802      HO          1.690555    Opter
752         201712      LC          0.993611    Opter

我正在对一个数据集执行透视操作,最终结果将包含大约500万行和600列。 上面是创建数据透视的数据示例。在

^{pr2}$

对200000个记录样本执行此操作需要大约93.7毫秒,当我按如下方式分组时:

#Grouby
df_tier.groupby(['device_id','net_grp']).agg({'tuning_hours':['sum']}).unstack(level='net_grp').fillna(0).reset_index().set_index('device_id')

大约需要15毫秒

但是,pivot的输出更有用,因为它包含正确的列名,而groupby的输出:

group by中的列名不正确

('watch\u hours'、'sum'、'TCH')、('watch\u hours'、'sum'、'SPE')、('watch\u hours'、'sum'、'NCK')

如何才能从这些列名称中只得到net\u grp say TCH?在

我想在这里使用groupby,因为在处理整个数据时会出现性能问题。有人能帮我正确地得到列名吗?在

谢谢


Tags: 数据idindexnetdeviceserwatchsum
1条回答
网友
1楼 · 发布于 2024-04-24 21:33:56

我建议使用sum代替agg删除列中Multiindex中第一个和第二个不必要的级别:

df1 = (df_tier.groupby(['device_id','net_grp'])['watch_hours']
              .sum()
              .unstack(level='net_grp', fill_value=0))
print (df1)
net_grp         ECC        HO        LC       NCK       NJV       SHX  \
device_id                                                               
107        0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
115        0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
183        0.000000  1.690555  0.000000  0.000000  0.000000  0.000000   
249        3.869166  0.000000  0.000000  0.000000  0.000000  0.000000   
748        0.000000  0.000000  0.000000  0.000000  0.000000  2.461111   
752        0.000000  0.000000  0.993611  0.000000  0.000000  0.000000   
786        0.000000  0.000000  0.000000  0.563888  0.000000  0.000000   
843        0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
896        0.000000  0.000000  0.000000  0.000000  0.820833  0.000000   

net_grp         SPE       TCH        US  
device_id                                
107        0.000000  0.000000  2.575555  
115        1.478055  0.000000  0.000000  
183        0.000000  0.000000  0.000000  
249        0.000000  0.000000  0.000000  
748        0.000000  0.000000  0.000000  
752        0.000000  0.000000  0.000000  
786        0.000000  0.000000  0.000000  
843        0.000000  0.250277  0.000000  
896        0.000000  0.000000  0.000000 

如果要使用agg的解决方案,请按^{}删除第一级和第二级:

^{pr2}$

相关问题 更多 >