我的时间序列数据包含一个可以取值A,B或C的列。
我的数据示例如下:
date,category
2017-01-01,A
2017-01-15,B
2017-01-20,A
2017-02-02,C
2017-02-03,A
2017-02-05,C
2017-02-08,C
我希望按月对数据进行分组,并在a_or_b_count
列中存储A的计数和B的计数之和,并在C
中存储c_count
的数量。< / p>
我尝试了几件事,但我能做的最接近的事情就是使用以下功能预处理数据:
def preprocess(df):
# Remove everything more granular than day by splitting the stringified version of the date.
df['date'] = pd.to_datetime(df['date'].apply(lambda t: t.replace('\ufeff', '')), format="%Y-%m-%d")
# Set the time column as the index and drop redundant time column now that time is indexed. Do this op in-place.
df = df.set_index(df.date)
df.drop('date', inplace=True, axis=1)
# Group all events by (year, month) and count category by values.
counted_events = df.groupby([(df.index.year), (df.index.month)], as_index=True).category.value_counts()
counted_events.index.names = ["year", "month", "category"]
return counted_events
给了我以下内容:
year month category
2017 1 A 2
B 1
2 C 3
A 1
总结所有A和B的过程非常简单,因为在这种情况下,类别会成为索引的一部分。
我是一个绝对的熊猫威胁,所以我很可能比现在更难。谁能给出如何在熊猫中实现这种分组的技巧?答案 0 :(得分:4)
我试过这样的帖子虽然我更喜欢@Scott Boston的解决方案,因为我之前合并了A和B值。
df.date = pd.to_datetime(df.date, format = '%Y-%m-%d')
df.loc[(df.category == 'A')|(df.category == 'B'), 'category'] = 'AB'
new_df = df.groupby([df.date.dt.year,df.date.dt.month]).category.value_counts().unstack().fillna(0)
new_df.columns = ['a_or_b_count', 'c_count']
new_df.index.names = ['Year', 'Month']
a_or_b_count c_count
Year Month
2017 1 3.0 0.0
2 1.0 3.0