2017-01-23 37 views
2

分组我有一个数据帧DF1获得集索引值,由列今年

 date  
sample 
a1  2005-08-28 
b1  2005-06-23 
c1  2006-01-11 
d1  ... 

最后,我想的样本集的字典,按年分组。因此,像

dict_y = {"2005": {a1, b2}, "2006": {c1}, ...} 

我想接近这将是利用熊猫GROUPBY最好的方式,但我似乎无法得到它的工作。

df2 = df1.reset_index() 
df2 = df2.set_index([(df2["date"].dt.year)]) 
df3 = df2.groupby(df2.index.values) 

但是这里df3并不是按年份整齐分组的数据框,而只是一个“GroupBy对象”。我在这里做错了什么?

回答

2

您可以通过dt.yearapply拉姆达函数,其中转换indexsets使用groupby。最后转换to_dict

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'}} 
+0

作品(几乎)像一个魅力!但是,必须在那里删除.date,因为它返回AttributeError:'Series'对象没有'date'属性。但没有.date它有效。另一件事是,它返回的年份不是整数,而是一位小数,例如“2016.0”。任何想法可能会导致这种行为或如何摆脱它? –

+0

我想你可以删除'date',因为你有'Series',而不是'DataFrame'就像'df = pd.Series([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 '])',所以没关系,因为Series没有列。 float的另一个问题可能是'pandas'的版本,我测试它在'0.19.2'或者'Series'中的一些'NaT'值 - 通过'(df [df.isnull()])检查' – jezrael

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'}}