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

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

我有以下来自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

我希望 Dataframe 由“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列中的每个唯一值在右侧都有自己的列集,但与其余数据共享同一日期。
我该怎么做呢?我必须要解卷、融化、交叉表或其他什么吗?我不知道该使用什么函数,甚至不知道从哪里开始解决这个问题。
有什么想法吗?
我知道还有很长的路要走,
首先,我过滤 Dataframe 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')

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

lf5gs5x2

lf5gs5x21#

你描述说,有些事情模棱两可 wban 要用作枢轴的值,但在提供的数据集中,包含“486990”和“486980”的列是 stn . 剩下的,我会考虑你想通过 stn . 如果不是这样,请更正您的问题。
你可以用 pandas.DataFrame.pivot ,指定除 stnwban 作为价值观。然后重新加工 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

相关问题