2014-09-10 36 views
0

出於演示的目的,第一,我定義了幾個簡單的dataframes的,df0df1不一致的行爲.agg(LEN)`

>>> import pandas as pd 
>>> import collections as co 
>>> data = [['a', 1], 
...   ['b', 2], 
...   ['a', 3], 
...   ['b', 1], 
...   ['a', 2], 
...   ['a', 3], 
...   ['b', 1]] 
>>> colnames = tuple('XY') 
>>> df0 = pd.DataFrame(co.OrderedDict([(colnames[i], 
...          [row[i] for row in data]) 
...         for i in range(len(colnames))])) 
>>> df0 
    X Y 
0 a 1 
1 b 2 
2 a 3 
3 b 1 
4 a 2 
5 a 3 
6 b 1 
>>> 
>>> df1 = df0.ix[:, [0]] 
>>> df1 
    X 
0 a 
1 b 
2 a 
3 b 
4 a 
5 a 
6 b 

現在,這裏的結果分組對df0所有列,並與len聚合爲聚合函數:

>>> df0.groupby(['X', 'Y']).agg(len) 
X Y 
a 1 1 
    2 1 
    3 2 
b 1 2 
    2 1 
dtype: int64 

在此基礎上,我預計爲0的類似操作,即df1.groupby(['X']).agg(len),將使這樣的:

X 
a 4 
b 3 
dtype: int64 

但是,這不是發生了什麼:

>>> df1.groupby(['X']).agg(len) 
Empty DataFrame 
Columns: [] 
Index: [a, b] 

我的問題是:

  1. 在行爲上的東西這個區別,我可以期待在一些熊貓文檔的基礎上,還是熊貓的錯誤​​? (如果前者是這種情況,請將我指向相關文檔。)
  2. df1.groupby(['X']).agg(len)獲得我期望的輸出(如上所示)的最簡單方法是什麼?
+0

在#2中獲得所需內容的最簡單方法可能是數據透視表。重置索引,然後使用df1.pivot_table(index ='X',values ='index',aggfunc = len) – DataSwede 2014-09-10 18:40:00

回答

2

請參見彙總部分底部的註釋:http://pandas.pydata.org/pandas-docs/stable/groupby.html#aggregation。熊貓「吃」聚合器列,所以你沒有什麼可以聚合。

你基本上有一個系列在這一點上。所以,你可以這樣做:

In [63]: s = df1['X'] 

In [64]: s.groupby(s).agg(len) 
Out[64]: 
X 
a 4 
b 3 
Name: X, dtype: int64 

大熊貓不會自動做這個,因爲它很難弄清楚這是你想要什麼,使得邏輯更加複雜。我想你可以把它稱爲一個錯誤(因爲它應該提高),但它在技術上是有效的。