如何分组后获得包含所有行的数据帧?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何分组后获得包含所有行的数据帧?相关的知识,希望对你有一定的参考价值。

我有一个数据帧:

DF

    Date   Close    Open 
0 2012-01-02  348.36  342.19 
1 2012-01-03  355.23  350.24 
2 2012-01-04  354.00  352.84 
3 2012-01-05  352.23  352.12 
4 2012-01-06  351.24  351.97 

df有14000行。

我想groupby年份和月份,并得到一个multiindex数据帧。

df['Date'] = pd.to_datetime(df['Date']) 
# df.set_index('Date',inplace=True,drop=True)
df1 = df.groupby([df.Date.dt.year.rename('year'),df.Date.dt.month.rename('month')]).values 

我曾尝试.values .count(不给我预期的输出)。

预期输出:

 df1

year   month Date        Close    Open 
2012   1     2012-01-02  348.36  342.19 
             2012-01-03  355.23  350.24 
             2012-01-04  354.00  352.84 
             2012-01-05  352.23  352.12 
             2012-01-06  351.24  351.97 
答案

使用set_index

df['Date'] = pd.to_datetime(df['Date']) 

df1 = df.set_index([df.Date.dt.year.rename('year'),df.Date.dt.month.rename('month')])

类似与rename_axis

df1 = df.set_index([df.Date.dt.year,df.Date.dt.month]).rename_axis(['year','month'])

print (df1)
                 Date   Close    Open
year month                           
2012 1     2012-01-02  348.36  342.19
     1     2012-01-03  355.23  350.24
     1     2012-01-04  354.00  352.84
     1     2012-01-05  352.23  352.12
     1     2012-01-06  351.24  351.97

另一种解决方案(更详细):

df.index = pd.MultiIndex.from_arrays([df.Date.dt.year.rename('year'),
                                      df.Date.dt.month.rename('month')])

df.index = pd.MultiIndex.from_arrays([df.Date.dt.year,
                                      df.Date.dt.month], names=('year','month'))

以上是关于如何分组后获得包含所有行的数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地过滤由两列groupby操作获得的数据帧,以仅包含第二个索引的最大值和最小值?

如何有效地迭代 Pandas 数据帧的连续块

MySQL必知应会-第13章-分组数据

IP网中,IP分组到达目的网路后,如何转换为MAC帧在LAN中传输

加入两个数据框以获得笛卡尔积[重复]

如何返回一个新的数据框,其中数字代表其包含行的百分比[重复]