我不知道从哪里开始这样做,因为我没有尝试而道歉。
这是我数据的初始形状:
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年的桶:
如果可能的话,我想通过一个让'Year-Mth'可重新取样的过程来做到这一点 - 所以我可以轻松切换到不同的桶。
答案 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)