我有一个数据帧df1
date
sample
a1 2005-08-28
b1 2005-06-23
c1 2006-01-11
d1 ...
最终,我想要一组按年分组的样本字典。像
这样的东西dict_y = {"2005": {a1, b2}, "2006": {c1}, ...}
我认为解决这个问题的最佳方法是使用pandas groupby,但我似乎无法让它工作。
df2 = df1.reset_index()
df2 = df2.set_index([(df2["date"].dt.year)])
df3 = df2.groupby(df2.index.values)
但是这里df3不是一个整齐地按年份分组的数据帧,而只是一个“GroupBy对象”。我在这里做错了什么?
答案 0 :(得分:2)
您可以使用groupby
dt.year
和apply
lambda函数to_dict
将index
值转换为sets
。上次转换https://wordpress.stackexchange.com/questions/177070/filter-query-based-on-date-in-custom-field:
df = pd.DataFrame({'date': [pd.Timestamp('2005-08-28 00:00:00'),
pd.Timestamp('2005-06-23 00:00:00'),
pd.Timestamp('2006-01-11 00:00:00')]}, index=['a1','b1','c1'])
print (df)
date
a1 2005-08-28
b1 2005-06-23
c1 2006-01-11
df = df.groupby(df.date.dt.year).apply(lambda x: set(x.index.values)).to_dict()
print (df)
{2005: {'a1', 'b1'}, 2006: {'c1'}}
答案 1 :(得分:1)
使用 GroupBy的 .groups
属性的另一个变体,它返回一个字典。
稍后将字典的值从pd.Index
类型转换为set
以从中提取唯一元素。
{k:set(v) for k,v in df.groupby(df['date'].dt.year).groups.items()}
Out[54]:
{2005: {'a1', 'b1'}, 2006: {'c1'}}