如何对列进行分组并返回dataFrame而不是分组对象

时间:2019-05-14 09:44:40

标签: python pandas

我有一个看起来像这样的dataFrame:

Date        Yearly_cost
2009-01-01  230
2010-03-03  260
2009-01-01  320
2007-03-02  430

同一dataFrame包含Date的多个重复值,但Yearly_cost的值不同。我想对日期进行分组,以便我有一个一致的时间序列,并且每天都有所有相应的值。但是我希望它返回一个df而不是一个groupby对象。

所需的结果将如下所示:

Date Yearly_cost 2007-03-02 430 2009-01-01 230, 320 2010-03-03 260

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

假设您具有以下df:

df1 = pd.DataFrame({'Date': ['2009-01-01', '2009-01-01', '2010-03-03' , '2010-03-03', '2004-04-03' ,'2007-03-02'],
'Yearly_cost': [230 ,460, 260, 250, 320 ,430],})
df1

df1

        Date    Yearly_cost
0   2009-01-01  230
1   2009-01-01  460
2   2010-03-03  260
3   2010-03-03  250
4   2004-04-03  320
5   2007-03-02  430

您可以执行以下操作:

df1['Yearly_cost'] = df1.Yearly_cost.astype(str)
df1.groupby('Date')['Yearly_cost'].apply(','.join)

结果:

Date
2004-04-03        320
2007-03-02        430
2009-01-01    230,460
2010-03-03    260,250
Name: Yearly_cost, dtype: object

为了使上面的数据帧:

df1['Yearly_cost'] = df1.Yearly_cost.astype(str)
combined = df1.groupby('Date')['Yearly_cost'].apply(','.join)
pd.DataFrame(combined)

您会得到:

            Yearly_cost
Date    
2004-04-03  320
2007-03-02  430
2009-01-01  230,460
2010-03-03  260,250

答案 1 :(得分:1)

要回答修订后的问题,请使用:

df.groupby('Date')['Yearly_cost'].apply(list).reset_index(name='Yearly_cost')

例如,如果要更改[320]320,请执行以下操作:

df.groupby('Date')['Yearly_cost'].apply(list).apply(lambda x: x[0] if len(x) == 1 else x).reset_index(name='Yearly_cost')