python—如何基于 Dataframe (pivot或unpivot?)中列的值在pandas中创建新列

n7taea2i  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(468)

我有以下来自noaa气象站的天气数据。

  1. stn wban date temp count_temp dewp count_dewp slp count_slp stp count_stp visib
  2. 486990 99999 1/1/2020 82.6 24 73.9 24 9999.9 0 999.9 0 6.2
  3. 486980 99999 1/1/2020 82.4 24 74.4 24 9999.9 0 999.9 0 6.3
  4. 486990 99999 2/1/2020 82 24 74.7 24 9999.9 0 999.9 0 6.1
  5. 486980 99999 2/1/2020 82.2 24 75.1 24 9999.9 0 999.9 0 6.1
  6. 486990 99999 3/1/2020 82.1 24 75.2 24 9999.9 0 999.9 0 6.2
  7. ... ... ... ... ... ... ... ... ... ... ... ...
  8. 486990 99999 29/12/2020 79.3 24 73.5 24 9999.9 0 999.9 0 5.9
  9. 486980 99999 30/12/2020 81.8 24 74.6 24 9999.9 0 999.9 0 6.1
  10. 486990 99999 30/12/2020 81.8 24 72.7 24 9999.9 0 999.9 0 6.2
  11. 486980 99999 31/12/2020 81.1 24 75 24 9999.9 0 999.9 0 6.2
  12. 486990 99999 31/12/2020 80.4 24 72.9 24 9999.9 0 999.9 0 6.1

我希望 Dataframe 由“wban”列分隔
我希望它看起来像那样,

  1. 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
  2. 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
  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
  4. ..............................
  5. 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
  6. 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列中的每个唯一值在右侧都有自己的列集,但与其余数据共享同一日期。
我该怎么做呢?我必须要解卷、融化、交叉表或其他什么吗?我不知道该使用什么函数,甚至不知道从哪里开始解决这个问题。
有什么想法吗?
我知道还有很长的路要走,
首先,我过滤 Dataframe stn .
然后我运行for循环并合并日期上的每个帧。

  1. frame = df[df.stn.unique()]
  2. for i in df.stn.unique():
  3. temp = df[df.stn==i]
  4. frame.merge(temp, how='left', on='date')

是否有一个更短更有效的功能来执行此操作?

lf5gs5x2

lf5gs5x21#

你描述说,有些事情模棱两可 wban 要用作枢轴的值,但在提供的数据集中,包含“486990”和“486980”的列是 stn . 剩下的,我会考虑你想通过 stn . 如果不是这样,请更正您的问题。
你可以用 pandas.DataFrame.pivot ,指定除 stnwban 作为价值观。然后重新加工 MultiIndex 通过连接名称,将其作为单个索引。最后,使用 dropna 删除数据不完整的行(可选)

  1. df2 = df.pivot(index='date',
  2. columns=['stn'],
  3. values=df.columns.drop(['stn', 'wban'])
  4. )
  5. df2.columns = ['%s_%s' % cols for cols in df2.columns]
  6. df2.dropna()

输出:

  1. 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
  2. date
  3. 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
  4. 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
  5. 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
  6. 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
展开查看全部

相关问题