2014-11-21 91 views
-1

我想熊貓-方式GROUPBY像itertools.groupby

>> x = np.arange(0,4*np.pi,0.1) 
>> y = np.sin(x) 
>> df = pd.DataFrame(index=x, data=y) 

>> map(lambda (k, v): (k, list(v)), groupby(np.sin(x), lambda x: x>=0)) 
[(True, 
    [0.0, ..., 0.041580662433290491]), 
(False, 
    [-0.058374143427580086, ..., -0.083089402817496397]), 
(True, 
    [0.016813900484350601, ..., 0.024775425453357765]), 
(False, 
    [-0.075151120461809301, ..., -0.066321897351200684]) 
] 

但在更多的 「熊貓通」 使用df

pd.groupby(.)(據我所知)給了我僅有2組而不是4

+0

那麼,爲什麼不使用'pandas.DataFrame.groupby'來重寫? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html – cel 2014-11-21 11:28:20

+1

是的,但我只能用pandas.groupby得到2個bin(true,false),這是我想避免的。 。 – SlimJim 2014-11-21 12:12:49

回答

1

你可以使用diff隨後cumsum給每個組的Trues和Falses自己的號碼:

import numpy as np 
import pandas as pd 
x = np.arange(0,4*np.pi,0.1) 
y = np.sin(x) 
df = pd.DataFrame(y, index=x) 

mask = np.sin(df[0])>=0 
groupnum = mask.diff().fillna(method='bfill').fillna(0).cumsum() 
print([(key, grp.head()) for key, grp in df.groupby(groupnum)]) 

收益率

[(0,    0 
0.0 0.000000 
0.1 0.099833 
0.2 0.198669 
0.3 0.295520 
0.4 0.389418), (1,    0 
3.2 -0.058374 
3.3 -0.157746 
3.4 -0.255541 
3.5 -0.350783 
3.6 -0.442520), (2,    0 
6.3 0.016814 
6.4 0.116549 
6.5 0.215120 
6.6 0.311541 
6.7 0.404850), (3,    0 
9.5 -0.075151 
9.6 -0.174327 
9.7 -0.271761 
9.8 -0.366479 
9.9 -0.457536)] 
+0

這似乎給那些長度爲1的數據幀有所不同,有時這種情況發生在我的管道中。在這些調用'diff''會導致一個空的df,這不會導致組。 – 2015-11-02 11:25:04

+0

要處理長度爲1的數據幀,請在調用'cumsum'之前添加'.fillna(0)'。 (請參閱上面的編輯。) – unutbu 2015-11-02 13:34:00