pivot_table:pandas - 如何转换数据框和访问列的数据透视输出?

pivot_table: pandas - how to transform pivot output for data frame and access columns?

import numpy as np
import pandas as pd

data = {'experiment_name': ['exp1', 'exp1', 'exp1', 'exp1', 'exp1', 'exp1'], 
'variant': ['A', 'B', 'A','B','A','B'],'sessions_with_orders':[1,2,6,0,23,12],
'total_sessions':[10,23,56,22,89,12]}  

Create DataFrame

df = pd.DataFrame(data)    

final_pivot=(df.pivot_table(index='variant',columns='experiment_name',values=['total_sessions','sessions_with_orders'],aggfunc=np.sum)
.assign(ratio=lambda d: d['sessions_with_orders']/d['total_sessions']) )

final_pivot_reset=final_pivot.reset_index() ##this 使用 .iloc

创建一个可访问的数据框
type(final_pivot_reset)
pandas.core.frame.DataFrame

我认为 final_pivot.reset_index() 做的不对?

此外,我在从重置输出访问 column/names 时遇到了挑战。当我查看列名时,它们是分层的(pivot_table 的默认输出)。

final_pivot_reset.columns

MultiIndex([(             'variant',     ''),
            ('sessions_with_orders', 'exp1'),
            (      'total_sessions', 'exp1'),
            (               'ratio',     '')],
           names=[None, 'experiment_name'])

比如我想访问final_pivot_reset.ratio如何实现?

我已经创建了一个 post 关于如何为 pivot_table

动态创建自定义列

谢谢。

您可以在 pivot_table 之后用分隔符 _ 压平 MultiIndex,因此更改 ratio 的列名。最后如果需要将 index 转换为列 variant 添加 DataFrame.reset_index:

final_pivot=df.pivot_table(index='variant',
                           columns='experiment_name',
                           values=['total_sessions','sessions_with_orders'],
                           aggfunc=np.sum)
final_pivot.columns = [f'{a}_{b}' for a, b in final_pivot.columns] 
final_pivot = (final_pivot.assign(ratio=lambda d: d['sessions_with_orders_exp1']/d['total_sessions_exp1'])
                          .reset_index())
print (final_pivot)
  variant  sessions_with_orders_exp1  total_sessions_exp1     ratio
0       A                         30                  155  0.193548
1       B                         14                   57  0.245614