Python 如何从现有数据帧创建新数据帧

Python 如何从现有数据帧创建新数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据就是这样的格式 T1 YEAR JAN FEB MAR APRL DEC G1 ABC 2015 0 18.6 0.9 6.9 3.0 DATA ABC 2016 8.9 0 0 3.9 0 TECH DEF 2020 0 9.0 0 8.06 6 TECH GHI 2017 0 1.1 9.8 6.8

我的数据就是这样的格式

T1    YEAR   JAN  FEB    MAR   APRL   DEC    G1
ABC   2015   0    18.6   0.9    6.9    3.0   DATA
ABC   2016   8.9   0      0      3.9    0    TECH
DEF   2020    0    9.0    0      8.06    6    TECH
GHI   2017    0    1.1   9.8      6.8     0    OPT
JKL   2018   7.1   2.1    0       0       8    DATA
JKL   2020    5     2     6        6      5     OTHER
我所做的是:

df = df.groupby(['T1','YEAR','G1'])['JAN','FEB','MAR','APRL','DEC'].SUM()
我得到的输出是:

                      JAN    FEB      MAR    APRL   DEC  
T1     G1    YEAR 
----------------------------------------------------------
ABC  DATA    2015      25.9   55.8     5.9     7.9   66
              2016      2      0.9      0      8.0   66
              2017      0      88       1.09    66    0
              2018      55      77      7.1      6.0  1.9
              2019      7.9     5.0      6.9     98    6.0
              2020       7     55.0       77      98   7.8
ABC   TECH    (2015-2020)....
现在我需要以下格式的输出:

T1    G1     VALUES      TIME
---------------------------------
ABC    DATA   25.9        2015-01-01 00:00:00
ABC    DATA    55.8        2015-02-01 00:00:00
ABC     DATA    5.9        2015-03-01 00:00:00
ABC      DATA   7.9         2015-04-01 00:00:00
我从我这边开始尝试的是:

 for i , j in df.iterrows():
    for n in range (0,276)          (here I want to know how can I put my whole iterating value under one
       value =df.iloc[n,:]             column name 'Value')
        print(value)    
还有,我如何访问groupby值T1,G1,YEAR 我试着这样做:

GRP = pd.DataFrame(df.groupby(['T1','G1','YEAR']))
在这里,我试图创建一个新的数据框架,其中包含T1、G1列,然后我会在数据框架中添加该值列


有谁能告诉我如何解决这个问题吗?

你可以
融化数据帧,然后创建一个新的日期时间列。然后保留/重新排列必要的列并对值进行排序:

df = df.groupby(['T1','YEAR','G1'])[['JAN','FEB','MAR','APRL','DEC']].sum().reset_index().rename({'APRL' : 'APR'}, axis=1)
df = df.melt(id_vars=['T1', 'YEAR','G1'], var_name='TIME', value_name='VALUES')
df['TIME'] = pd.to_datetime(df['TIME'] + '-' + df['YEAR'].astype(str))
df = df[['T1', 'G1', 'VALUES', 'TIME']].sort_values(['T1', 'G1','TIME'])
df
Out[1]: 
     T1     G1  VALUES       TIME
0   ABC   DATA    0.00 2015-01-01
6   ABC   DATA   18.60 2015-02-01
12  ABC   DATA    0.90 2015-03-01
18  ABC   DATA    6.90 2015-04-01
24  ABC   DATA    3.00 2015-12-01
1   ABC   TECH    8.90 2016-01-01
7   ABC   TECH    0.00 2016-02-01
13  ABC   TECH    0.00 2016-03-01
19  ABC   TECH    3.90 2016-04-01
25  ABC   TECH    0.00 2016-12-01
2   DEF   TECH    0.00 2020-01-01
8   DEF   TECH    9.00 2020-02-01
14  DEF   TECH    0.00 2020-03-01
20  DEF   TECH    8.06 2020-04-01
26  DEF   TECH    6.00 2020-12-01
3   GHI    OPT    0.00 2017-01-01
9   GHI    OPT    1.10 2017-02-01
15  GHI    OPT    9.80 2017-03-01
21  GHI    OPT    6.80 2017-04-01
27  GHI    OPT    0.00 2017-12-01
4   JKL   DATA    7.10 2018-01-01
10  JKL   DATA    2.10 2018-02-01
16  JKL   DATA    0.00 2018-03-01
22  JKL   DATA    0.00 2018-04-01
28  JKL   DATA    8.00 2018-12-01
5   JKL  OTHER    5.00 2020-01-01
11  JKL  OTHER    2.00 2020-02-01
17  JKL  OTHER    6.00 2020-03-01
23  JKL  OTHER    6.00 2020-04-01
29  JKL  OTHER    5.00 2020-12-01

您可以
melt
dataframe,然后创建一个新的datetime列。然后保留/重新排列必要的列并对值进行排序:

df = df.groupby(['T1','YEAR','G1'])[['JAN','FEB','MAR','APRL','DEC']].sum().reset_index().rename({'APRL' : 'APR'}, axis=1)
df = df.melt(id_vars=['T1', 'YEAR','G1'], var_name='TIME', value_name='VALUES')
df['TIME'] = pd.to_datetime(df['TIME'] + '-' + df['YEAR'].astype(str))
df = df[['T1', 'G1', 'VALUES', 'TIME']].sort_values(['T1', 'G1','TIME'])
df
Out[1]: 
     T1     G1  VALUES       TIME
0   ABC   DATA    0.00 2015-01-01
6   ABC   DATA   18.60 2015-02-01
12  ABC   DATA    0.90 2015-03-01
18  ABC   DATA    6.90 2015-04-01
24  ABC   DATA    3.00 2015-12-01
1   ABC   TECH    8.90 2016-01-01
7   ABC   TECH    0.00 2016-02-01
13  ABC   TECH    0.00 2016-03-01
19  ABC   TECH    3.90 2016-04-01
25  ABC   TECH    0.00 2016-12-01
2   DEF   TECH    0.00 2020-01-01
8   DEF   TECH    9.00 2020-02-01
14  DEF   TECH    0.00 2020-03-01
20  DEF   TECH    8.06 2020-04-01
26  DEF   TECH    6.00 2020-12-01
3   GHI    OPT    0.00 2017-01-01
9   GHI    OPT    1.10 2017-02-01
15  GHI    OPT    9.80 2017-03-01
21  GHI    OPT    6.80 2017-04-01
27  GHI    OPT    0.00 2017-12-01
4   JKL   DATA    7.10 2018-01-01
10  JKL   DATA    2.10 2018-02-01
16  JKL   DATA    0.00 2018-03-01
22  JKL   DATA    0.00 2018-04-01
28  JKL   DATA    8.00 2018-12-01
5   JKL  OTHER    5.00 2020-01-01
11  JKL  OTHER    2.00 2020-02-01
17  JKL  OTHER    6.00 2020-03-01
23  JKL  OTHER    6.00 2020-04-01
29  JKL  OTHER    5.00 2020-12-01

我在datetime转换的第三行出现错误…请注意我的代码行:
.rename({'APRL':'APR'}
。请确保您所有的月份都是
一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月
。否则,您应该像我一样重命名它们。是的,我的月份只有@David Erickson的格式。但是我的错误是“未知字符串格式:'.Time-2015')@SimranAgrawal
df['YEAR']的输出是什么。unique()
?你能把它贴在这里吗?另外,在运行代码之前,
df.columns
的输出是什么?你能把它也贴在这里吗?Df['YEAR']。唯一()o/p:arry([20152016201920202018],dtype=int 64)。Df.columns。0/p:Index['T1','YEAR','G1','TIME','VALUES')我在日期时间转换的第三行中遇到错误…请注意我的代码行:
。重命名({'APRL':'APR'}
。请确保您所有的月份都是
一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月
。否则,您应该像我一样重命名它们。是的,我的月份只有@David Erickson这种格式。但我的错误是“未知字符串格式:'.Time-2015')@SimranAgrawal
df['YEAR']的输出是什么。unique()
?您可以将其粘贴到这里吗?另外,在运行代码之前,df.columns的输出是什么?您也可以将其粘贴到这里吗?df['YEAR'].unique()o/p:arry([20152016201920202018],dtype=int 64)。df.columns.0/p:Index['T1','YEAR','G1','TIME','VALUES')