python - 如何正确使用数据透视创建自定义列名
问题描述
我有一个数据框,其中包含按日期排序的因子的多个值,例如:
date_and_time date hour factor st0 st1 st2
0 2012-01-01 00:00:00 2012-01-01 0 PM25 69.4000 58.00000 51.60000
1 2012-01-01 00:00:00 2012-01-01 0 CO 1.3800 1.15714 1.06585
2 2012-01-01 01:00:00 2012-01-01 1 PM25 127.2000 77.33330 89.20000
3 2012-01-01 01:00:00 2012-01-01 1 CO 1.5800 1.57143 1.63169
我将如何获得:
date_and_time date hour PM25_st0 PM25_st1 PM25_st2 COst0 COst1 COst2
0 2012-01-01 00:00:00 2012-01-01 0 69.4000 58.0000 51.6000 1.3800 1.15714 1.06585
1 2012-01-01 01:00:00 2012-01-01 1 127.200 77.3333 89.2000 1.5800 1.57143 1.63169
基本上旋转并创建相应的列,首先我尝试这样做:
df_data = {
'date_and_time': ['2012-01-01 00:00:00','2012-01-01 00:00:00','2012-01-01 01:00:00','2012-01-01 01:00:00' ],
'date': ['2012-01-01','2012-01-01','2012-01-01','2012-01-01'],
'hour':[0,0,1,1],
'factor':['PM25','CO','PM25','CO'],
'st0':[69.4000 ,1.3800,127.2000,1.5800],
'st1':[58.00000,1.15714,77.33330,1.57143],
'st2':[51.60000,1.06585,89.20000,1.63169]
}
df_test = pd.DataFrame(df_data, columns = ['date_and_time', 'date','hour','factor','st0','st1','st2'])
df_pivoted = pd.pivot_table(df_test,index=["date_and_time","date","hour"],columns=["factor"],values=["st0","st1","st2"])
并得到:
有没有办法按因素自定义列?
解决方案
DataFrame.sort_index
由 的第二级使用MultiIndex in columns
,然后使用交换级别的 s 列出理解,f-string
最后DataFrame.reset_index
用于来自 的列MultiIndex in index
:
df_pivoted = df_pivoted.sort_index(axis=1, level=1)
df_pivoted.columns = [f'{b}_{a}' for a, b in df_pivoted.columns]
df_pivoted = df_pivoted.reset_index()
print (df_pivoted)
date_and_time date hour CO_st0 CO_st1 CO_st2 PM25_st0 \
0 2012-01-01 00:00:00 2012-01-01 0 1.38 1.15714 1.06585 69.4
1 2012-01-01 01:00:00 2012-01-01 1 1.58 1.57143 1.63169 127.2
PM25_st1 PM25_st2
0 58.0000 51.6
1 77.3333 89.2
推荐阅读
- agora.io - 当用户连接到没有广播角色的频道时如何触发 OnUserJoined 事件
- python - 为什么我的 python 脚本没有在共享主机 cpanel GoDaddy 中运行
- testing - 消费者驱动的黄瓜合同测试
- css - 拆分按钮下拉菜单与第一个按钮对齐
- c++ - C++:具有可变参数的 Hacky 参数模式
- php - php curl如何从html中过滤数据
- sql-server - 选择分隔字符串字段的子集
- biztalk - 使用 URI“https://na59.salesforce.com/services/Soap/c/43.0/00Df4000001dsdy”在发送端口“”上发送到适配器“WCF-WebHttp”的消息被暂停
- security - 如果我网络之外的人对 wpa2 wifi 进行中间人攻击,他将能够读取数据吗?
- ios - 当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发