首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Pandas将面板数据转换为正确的形式

如何使用Pandas将面板数据转换为正确的形式
EN

Stack Overflow用户
提问于 2021-01-10 22:52:45
回答 2查看 103关注 0票数 1

从概念上讲,我似乎很难做到这一点,所以我不知道该如何编写代码。

我的数据框目前看起来像这样,其中我将GMT列拆分为日、月和年列,ID#是每个家庭的ID号,下面的值是每个时间的KwH使用量:

代码语言:javascript
运行
复制
0    GMT         ID1    ID2   ID3   ...   ID1000   Day   Month   Year
1    01/01/2012  0.2    0.15  0.1   ...   0.1      1     1       2012
2    02/01/2012  0.3    0.2   0.2   ...   0.4      2     1       2012
3    03/01/2012  0.1    0.4   0.1   ...   0.5      3     1       2012
.    .           .      .     .     ...   .        .     .       . 
.    .           .      .     .     ...   .        .     .       . 
.    .           .      .     .     ...   .        .     .       .
1000 31/12/2012  0.3    0.2   0.05  ...   0.4      31    12      2012

但是,我希望将其转换为表示面板数据集的方式,使其看起来如下所示:

代码语言:javascript
运行
复制
0     ID   GMT         Day   Month   Year    KwH
1     1    01/01/2012  1     1       2012    0.2
2     1    02/01/2012  2     1       2012    0.3
3     1    03/01/2012  3     1       2012    0.1
.     .     .          .     .       .       .        
.     .     .          .     .       .       .        
.     .     .          .     .       .       .       
10000 1000 31/12/2012  31    12      2012    0.3

因此,从本质上讲,我希望转置数据帧的方式是将ID列转置为行,并通过GMT对与每个ID关联的数据进行分组,以确保数据仍然与日期列正确匹配。

到目前为止,我一直在苦苦挣扎,因为df.transpose()函数似乎太生硬了,无法与我正在寻找的细微差别混淆。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-11 02:17:59

我以GMT为索引的样本数据帧。此外,您还可以获得较晚的日期、月份和年份

代码语言:javascript
运行
复制
            ID1  ID2    ID3  ID1000
GMT             
01/01/2012  0.2  0.15   0.1   0.1
02/01/2012  0.3  0.20   0.2   0.4
03/01/2012  0.1  0.40   0.1   0.5

然后,可以使用unstackGMTID组合为索引,将KwH组合为值

代码语言:javascript
运行
复制
output_df = df.unstack().to_frame()
output_df

最后,您可以进行必要的更改以获得正确格式的df

代码语言:javascript
运行
复制
output_df = output_df.reset_index().rename(columns={'level_0': 'ID', 0: 'KwH'})
output_df['ID'] = output_df['ID'].str.replace('ID', '') # remove ID from the ID column values
output_df['GMT'] = pd.to_datetime(output_df['GMT'])
output_df['Day'] = output_df['GMT'].dt.day
output_df['Month'] = output_df['GMT'].dt.month
output_df['Year'] = output_df['GMT'].dt.year
output_df

票数 0
EN

Stack Overflow用户

发布于 2021-01-11 03:42:15

这是针对您的数据子集的;您应该能够使其适用于您的其余数据:

代码语言:javascript
运行
复制
    df = pd.DataFrame({'0': [1, 2, 3],
 'GMT': ['01/01/2012', '02/01/2012', '03/01/2012'],
 'ID1': [0.2, 0.3, 0.1],
 'ID2': [0.15, 0.2, 0.4],
 'ID3': [0.1, 0.2, 0.1],
 'ID1000': [0.1, 0.4, 0.5],
 'Day': [1, 2, 3],
 'Month': [1, 1, 1],
 'Year': [2012, 2012, 2012]})

rename列,将ID列更改为KwH

代码语言:javascript
运行
复制
 reshape = df.rename(
    columns=lambda col: col.replace("ID", "KwH") if "ID" in col else col
)
reshape.columns
Index(['0', 'GMT', 'KwH1', 'KwH2', 'KwH3', 'KwH1000', 'Day', 'Month',
       'Year'],
      dtype='object')

接下来,应用pd.wide_to_long提取数据:

代码语言:javascript
运行
复制
pd.wide_to_long(reshape, stubnames="KwH", i=["0", "GMT"], j="IDs", sep="")

                    Year    Month   Day KwH
0   GMT        IDs              
1   01/01/2012  1   2012    1   1   0.20
                2   2012    1   1   0.15
                3   2012    1   1   0.10
               1000 2012    1   1   0.10
2   02/01/2012  1   2012    1   2   0.30
                2   2012    1   2   0.20
                3   2012    1   2   0.20
              1000  2012    1   2   0.40
3   03/01/2012  1   2012    1   3   0.10
                2   2012    1   3   0.40
                3   2012    1   3   0.10
              1000  2012    1   3   0.50
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65654585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档