熊猫对一列中的类别数据进行时间重采样,并从另一个数值列中进行计算

时间:2019-05-29 12:50:27

标签: pandas resampling datetimeindex

我有一个带有分类列和数值的数据框,索引设置为时间数据

df = pd.DataFrame({
        'date': [
            '2013-03-01 ', '2013-03-02 ',
            '2013-03-01 ', '2013-03-02',
            '2013-03-01 ', '2013-03-02 '
        ],
        'Kind': [
            'A', 'B', 'A', 'B', 'B', 'B'
        ],
        'Values': [1, 1.5, 2, 3, 5, 3]
    })

df['date'] =  pd.to_datetime(df['date'])
df = df.set_index('date')

上面的代码给出:

        Kind    Values
date        
2013-03-01  A   1.0
2013-03-02  B   1.5
2013-03-01  A   2.0
2013-03-02  B   3.0
2013-03-01  B   5.0
2013-03-02  A   3.0

我的目标是实现以下数据框架:


         A_count   B_count  A_Val max   B_Val max
date                
2013-03-01   2         1        2             5
2013-03-02   0         3        0             3

还有时间作为索引。在这里,我注意到如果我们使用

data = pd.DataFrame(data.resample('D')['Pack'].value_counts())

我们得到了:

    Kind
date    Kind    
2013-03-01  A   2
            B   1
2013-03-02  B   3

2 个答案:

答案 0 :(得分:1)

在列表理解的列中将MultiIndex展平使用DataFrame.pivot_table

df = pd.DataFrame({
        'date': [
            '2013-03-01 ', '2013-03-02 ',
            '2013-03-01 ', '2013-03-02',
            '2013-03-01 ', '2013-03-02 '
        ],
        'Kind': [
            'A', 'B', 'A', 'B', 'B', 'B'
        ],
        'Values': [1, 1.5, 2, 3, 5, 3]
    })

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

#is possible omit
#df = df.set_index('date')

df = df.pivot_table(index='date', columns='Kind', values='Values', aggfunc=['count','max'])
df.columns = [f'{b}_{a}' for a, b in df.columns]
print (df)
            A_count  B_count  A_max  B_max
date                                      
2013-03-01      2.0      1.0    2.0    5.0
2013-03-02      NaN      3.0    NaN    3.0

使用Grouper的另一种解决方案,可以按天重采样:

df = df.set_index('date')

df = df.groupby([pd.Grouper(freq='d'), 'Kind'])['Values'].agg(['count','max']).unstack()
df.columns = [f'{b}_{a}' for a, b in df.columns]

答案 1 :(得分:0)

但是为什么要导入

data = pd.read_csv('dataset.csv')

并像上面一样精确地df(具有数千行),然后使用

df = df.set_index('date')

df = df.groupby([pd.Grouper(freq='d'), 'Kind'])['Values'].agg(['count','max']).unstack()
df.columns = [f'{b}_{a}' for a, b in df.columns]

给出错误:

'DataFrame' object has no attribute 'Grouper'