如何解决如何根据数据框中列的值在 Pandas 中创建新列pivot 或 unpivot ?
我有以下来自 NOAA 气象站的天气数据。
stn wban date temp count_temp dewp count_dewp slp count_slp stp count_stp visib
486990 99999 1/1/2020 82.6 24 73.9 24 9999.9 0 999.9 0 6.2
486980 99999 1/1/2020 82.4 24 74.4 24 9999.9 0 999.9 0 6.3
486990 99999 2/1/2020 82 24 74.7 24 9999.9 0 999.9 0 6.1
486980 99999 2/1/2020 82.2 24 75.1 24 9999.9 0 999.9 0 6.1
486990 99999 3/1/2020 82.1 24 75.2 24 9999.9 0 999.9 0 6.2
... ... ... ... ... ... ... ... ... ... ... ...
486990 99999 29/12/2020 79.3 24 73.5 24 9999.9 0 999.9 0 5.9
486980 99999 30/12/2020 81.8 24 74.6 24 9999.9 0 999.9 0 6.1
486990 99999 30/12/2020 81.8 24 72.7 24 9999.9 0 999.9 0 6.2
486980 99999 31/12/2020 81.1 24 75 24 9999.9 0 999.9 0 6.2
486990 99999 31/12/2020 80.4 24 72.9 24 9999.9 0 999.9 0 6.1
我希望数据框由“wban”列分隔
我希望它看起来像那样,
date_486990 temp_486990 count_temp_486990 dewp_486990 count_dewp_486990 slp_486990 count_slp_486990 stp_486990 count_stp_486990 visib_486990 date_486980 temp_486980 count_temp_486980 dewp_486980 count_dewp_486980 slp_486980 count_slp_486980 stp_486980 count_stp_486980 visib_486980
1/1/2020 82.6 24 73.9 24 9999.9 0 999.9 0 6.2 1/1/2020 82.4 24 74.4 24 9999.9 0 999.9 0 6.3
2/1/2020 82 24 74.7 24 9999.9 0 999.9 0 6.1 2/1/2020 82.2 24 75.1 24 9999.9 0 999.9 0 6.1
..............................
30/12/2020 81.8 24 72.7 24 9999.9 0 999.9 0 6.2 30/12/2020 81.8 24 74.6 24 9999.9 0 999.9 0 6.1
31/12/2020 80.4 24 72.9 24 9999.9 0 999.9 0 6.1 31/12/2020 81.1 24 75 24 9999.9 0 999.9 0 6.2
我知道这有点难看,但基本上我希望 wban 列中的每个唯一值在右侧都有自己的一组列,但与其余数据共享相同的日期。
我该怎么做,我是否必须取消旋转、融合或交叉表或其他什么?我不确定要使用什么功能,甚至不知道从哪里开始解决这个问题。
有什么想法吗?
我知道很长的路要走,
首先我通过 stn
过滤数据框。
然后我运行一个 for 循环并合并日期的每一帧。
frame = df[df.stn.unique()]
for i in df.stn.unique():
temp = df[df.stn==i]
frame.merge(temp,how='left',on='date')
是否有更短更高效的 Pandas 函数来做到这一点?
解决方法
有些不明确,您描述了 wban
用作枢轴的值,但在提供的数据集中,带有“486990”“486980”的列是 stn
。对于其余部分,我会认为您希望以 stn
为中心。如果不是这种情况,请更正您的问题。
您可以使用 pandas.DataFrame.pivot
,将除 stn
和 wban
之外的所有列指定为值。然后通过连接名称将 MultiIndex
重新加工为单个索引。最后,使用dropna
去除数据不完整的行(可选)
df2 = df.pivot(index='date',columns=['stn'],values=df.columns.drop(['stn','wban'])
)
df2.columns = ['%s_%s' % cols for cols in df2.columns]
df2.dropna()
输出:
date_486980 date_486990 temp_486980 temp_486990 count_temp_486980 count_temp_486990 dewp_486980 dewp_486990 count_dewp_486980 count_dewp_486990 slp_486980 slp_486990 count_slp_486980 count_slp_486990 stp_486980 stp_486990 count_stp_486980 count_stp_486990 visib_486980 visib_486990
date
1/1/2020 1/1/2020 1/1/2020 82.4 82.6 24 24 74.4 73.9 24 24 9999.9 9999.9 0 0 999.9 999.9 0 0 6.3 6.2
2/1/2020 2/1/2020 2/1/2020 82.2 82 24 24 75.1 74.7 24 24 9999.9 9999.9 0 0 999.9 999.9 0 0 6.1 6.1
30/12/2020 30/12/2020 30/12/2020 81.8 81.8 24 24 74.6 72.7 24 24 9999.9 9999.9 0 0 999.9 999.9 0 0 6.1 6.2
31/12/2020 31/12/2020 31/12/2020 81.1 80.4 24 24 75 72.9 24 24 9999.9 9999.9 0 0 999.9 999.9 0 0 6.2 6.1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。