2017-10-07 99 views
0

我有按ID分组的每月数据,其中还有一个家长ID。数据是这样的:将月度数据转换为熊猫每季度的数据

data = pd.DataFrame({'parent_id': [1, 1, 1, 1, 1, 1, -99999, -99999, -99999], 
        'id': [123, 123, 123, 123, 123, 123, 123, 123, 123], 
        'data_1': [10, 20, 30, 40, 50, 60, 0, 0, 0], 
        'data_2': [10, 20, 30, 40, 50, 60, 0, 0, 0], 
        'period': [0, 1, 2, 3, 4, 5, 6, 7, 8], 
        'date': ['2017-06-30', '2017-07-31', '2017-08-31', 
           '2017-09-30', '2017-10-31', '2017-11-30', 
           '2017-12-31', '2018-01-31', '2018-02-28'], 
        'quarter': [0, 0, 0, 1, 1, 1, 2, 2, 2]}) 

data_2 = pd.DataFrame({'parent_id': [1, 1, 1, 1, 1, 1, -99999, -99999, -99999], 
        'id': [234, 234, 234, 234, 234, 234, 234, 234, 234], 
        'data_1': [10, 20, 30, 40, 50, 60, 0, 0, 0], 
        'data_2': [10, 20, 30, 40, 50, 60, 0, 0, 0], 
        'period': [0, 1, 2, 3, 4, 5, 6, 7, 8], 
        'date': ['2017-06-30', '2017-07-31', '2017-08-31', 
           '2017-09-30', '2017-10-31', '2017-11-30', 
           '2017-12-31', '2018-01-31', '2018-02-28'], 
        'quarter': [0, 0, 0, 1, 1, 1, 2, 2, 2]}) 

data = data.append(data_2) 
data = data.reindex() 

我有一个函数,当我有一个ID其中的作品,但是当我介绍了一个以上的ID,求和是不是唯一的一个ID。

def convert_to_quarterly(df, date): 
    """Aggregates 3 months of data to a quarterly value.""" 
    columns = ['data_1', 'data_2'] 
    df['date'] = pd.to_datetime(df['date']) 
    df = df.set_index('date') 
    df_quarterly = df.resample('Q')[columns].sum() 
    df_quarterly['date'] = df_quarterly.index 
    df['date'] = df.index 
    df.drop(columns, axis=1, inplace=True) 
    df = pd.merge(df, df_quarterly) 

    return df 

convert_to_quarterly(data, date=pd.to_datetime('2017-06-30')) 

我需要做些什么才能让大熊猫只给个别的ID组求和?

回答

2

如果您还没有这样做,则需要将日期列正式设置为日期时间类型。然后你可以使用groupby,然后重新采样。

data['date'] = data['date'].astype('datetime64[ns]') 
data.set_index('date').groupby('id').resample('Q')['data_1', 'data_2'].sum() 

       data_1 data_2 
id date      
123 2017-06-30  10  10 
    2017-09-30  90  90 
    2017-12-31  110  110 
    2018-03-31  0  0 
234 2017-06-30  20  20 
    2017-09-30  180  180 
    2017-12-31  220  220 
    2018-03-31  0  0 
+0

非常感谢!这正是我一直在寻找的!我不能相信我错过了一群人。你是一个救星!我一定会购买你的书并且关注你。谢谢您的帮助! –

+0

@TomCusack当然可以。感谢您的支持。由于这个问题,我确实发现了一个错误。你不应该用'set_index'在索引中放置日期列,因为resample有一个'on'参数,但在这种情况下它不起作用。 [请参阅此处了解github问题](https://github.com/pandas-dev/pandas/issues/17813) –