Pandas重新取样并将大小添加为列

时间:2016-11-17 09:17:52

标签: python pandas resampling

给定数据框:

Index       A  B
2016-01-01  5  10
2016-01-01  1  2
2016-01-02  1  1

是否可以使用sum重新采样DataFrame,并在DataFrame的末尾添加一列,其中包括bin中的观察计数,结果为:

Index      A  B  Count
2016-01-01 6  12 2
2016-01-02 1  1  1

2 个答案:

答案 0 :(得分:6)

您可以使用Resampler.aggDataFrameGroupBy.agg

df1 = df.resample('D').agg({'A':'sum', 'B':['sum', 'size']})
print (df1)
             B        A
           sum size sum
Index                  
2016-01-01  12    2   6
2016-01-02   1    1   1

df2 = df.groupby(level=0).agg({'A':'sum', 'B':['sum', 'size']})
print (df2)
             B        A
           sum size sum
Index                  
2016-01-01  12    2   6
2016-01-02   1    1   1

如果需要删除列中的MultiIndex

df1 = df.resample('D').agg({'A':'sum', 'B':['sum', 'size']})
df1.columns = ['B','Count','A'] 
df1 = df1[['A','B','Count']]
print (df1)
            A   B  Count
Index                   
2016-01-01  6  12      2
2016-01-02  1   1      1

df2 = df.groupby(level=0).agg({'A':'sum', 'B':['sum', 'size']})
df2.columns = ['B','Count','A'] 
df2 = df2[['A','B','Count']]
print (df2)
            A   B  Count
Index                   
2016-01-01  6  12      2
2016-01-02  1   1      1

答案 1 :(得分:0)

您还可以像下面这样用额外的count列来播种数据:

frame['count'] = 1  # A column of ones we can count
frame.resample(...).agg({
    'count': np.sum,
    'A': np.mean,
    ...
})

或者,如果您想说,请对count列以外的所有列进行平均:

frame['count'] = 1
frame.resample(...).agg({
    # Default aggregation
    **{key: np.mean for key in frame.keys()},
    # Override `count`
    'count': np.sum,
    # other columns you want to override
})