复杂的枢轴和重新采样

时间:2016-09-09 18:27:09

标签: python pandas

我不知道从哪里开始这样做,因为我没有尝试而道歉。

这是我数据的初始形状:

df = pd.DataFrame({
    'Year-Mth': ['1900-01'
                 ,'1901-02'
                 ,'1903-02'
                 ,'1903-03'
                 ,'1903-04'
                 ,'1911-08'
                 ,'1911-09'], 
    'Category': ['A','A','B','B','B','B','B'], 
    'SubCategory': ['X','Y','Y','Y','Z','Q','Y'], 
    'counter': [1,1,1,1,1,1,1]
})

df

这是我想要达到的结果 - 下面的Mth-Year已被重新采样为4年的桶:

enter image description here

如果可能的话,我想通过一个让'Year-Mth'可重新取样的过程来做到这一点 - 所以我可以轻松切换到不同的桶。

2 个答案:

答案 0 :(得分:5)

这是我的尝试:

df['Year'] = pd.cut(df['Year-Mth'].str[:4].astype(int), 
                    bins=np.arange(1900, 1920, 5), right=False)
df.pivot_table(index=['SubCategory', 'Year'], columns='Category', 
               values='counter', aggfunc='sum').dropna(how='all').fillna(0)
Out: 
Category                    A    B
SubCategory Year                  
Q           [1910, 1915)  0.0  1.0
X           [1900, 1905)  1.0  0.0
Y           [1900, 1905)  1.0  2.0
            [1910, 1915)  0.0  1.0
Z           [1900, 1905)  0.0  1.0

年份列未参数化,因为据我所知,pandas(或numpy)不提供带步长的剪切选项。但我认为可以通过最小/最大值的一点算法来完成。类似的东西:

df['Year'] = pd.to_datetime(df['Year-Mth']).dt.year
df['Year'] = pd.cut(df['Year'], bins=np.arange(df['Year'].min(), 
                    df['Year'].max() + 5, 5), right=False)

但这不会像Excel那样创建漂亮的垃圾箱。

答案 1 :(得分:3)

cols = [df.SubCategory, pd.to_datetime(df['Year-Mth']), df.Category]
df1 = df.set_index(cols).counter

df1.unstack('Year-Mth').T.resample('60M', how='sum').stack(0).swaplevel(0, 1).sort_index().fillna('')

enter image description here