2017-01-23 83 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'}}