2016-12-06 103 views
1

我嘗試使用掩碼從我的groupby對象中進行選擇,但出現無法解析的錯誤。熊貓:使用時間序列作爲掩模進行選擇

首先,我按GROUPID

df_grouped = df.groupby('groupid') 

然後,我計算出的STD,最小值和最大值從每個組中我選擇的口罩使用。

df_grouped_std = df_grouped.std() 
df_grouped_min = df_grouped.min() 
df_grouped_max = df_grouped.max() 

然後我在不同的參數上創建兩個遮罩。

s1 = df_grouped_std['distance']<0.05 
s2 = (df_grouped_max.speed- df_grouped_min.speed) < 10 

最後我結合了口罩。

sTot = s1&s2 

這提供了以下錯誤/堆棧跟蹤:

Traceback (most recent call last): 

    File "<ipython-input-198-b0df7aa8bb76>", line 1, in <module> 
    selection = df_grouped[sTot.values] 

    File "C:\Anaconda\lib\site-packages\pandas\core\groupby.py", line 3155, in __getitem__ 
    % str(bad_keys)[1:-1]) 

KeyError: 'Columns not found: False, True' 

後來我想用面膜來選擇。

selection = df_grouped[sTot] 

我看到,S1,S2和STOT是時間序列,也許這就是爲什麼我不能用它們來選擇,但我不能弄清楚爲什麼會。我在這裏錯過了什麼?

數據例如:

print(s1.head()) 
print(s2.head()) 
print(sTot.head()) 

groupid 
941   True 
942   True 
1721   True 
1722   True 
2201   True 
Name: distance, dtype: bool 

groupid 
941   True 
942   True 
1721   False 
1722   True 
2201   False 
Name: speed, dtype: bool 

groupid 
941   True 
942   True 
1721   False 
1722   True 
2201   False 
dtype: bool 
+0

你能輸出s1和s2的頭嗎?執行'print(s1.head())'和'print(s2.head())'並複製粘貼這裏的輸出 –

回答

1

我認爲你可以使用filter

print (df.groupby('groupID') 
     .filter(lambda x: (x.distance.std() < 0.05) & 
          ((x.speed.max()- x.speed.min()) < 10))) 

樣品(改變0.051):

df = pd.DataFrame({'groupID':[1,1,3,3], 
        'speed':[4,5,6,1], 
        'distance':[1,2,3,1]}) 

print (df) 
    distance groupID speed 
0   1  1  4 
1   2  1  5 
2   3  3  6 
3   1  3  1 

print (df.groupby('groupID') 
     .filter(lambda x: (x.distance.std() < 1) & 
          ((x.speed.max()- x.speed.min()) < 10))) 

    distance groupID speed 
0   1  1  4 
1   2  1  5 
+0

我會試試這個。 – marqram

+0

工作像魅力,比我想出的方法更清潔。 – marqram

1

你想要的結果是什麼?你是否希望所有條目在哪些組(條件成立的地方),還是僅僅是組的彙總信息?

我認爲@jezrael的解決方案是好的,如果你想要所有的條目。順便說一句,你可能會發現.get_group()有用。

你可以做到以下幾點:

for k, v in sTot.iteritems(): 
    if v == True: 
     print df_grouped.get_group(k) 
+0

謝謝,這也可以。然而,我想要的是所有條目,正如你所提到的,@jezraels解決方案對此非常有用。 – marqram

0

我想出了另一種解決方案。在問題的代碼之後:

df_grouped = df.groupby('groupid') 

df_grouped_std = df_grouped.std() 
df_grouped_min = df_grouped.min() 
df_grouped_max = df_grouped.max() 

s1 = df_grouped_std['distance']<0.05 
s2 = (df_grouped_max.speed- df_grouped_min.speed) < 10 

我確實適用於df_grouped_std

sTot2 = df_grouped_std[s1][s2][s3][s4][s5] 

然後我用的是選定列的索引值,所有的選擇,選擇那些從原來的(不集中)數據幀。最後我再次分組,因爲我需要這些組。

selection = sTot2.index.get_level_values(0) 
selected_groups = df[df.ROL_IDENT.isin(selection)].groupby('ROL_IDENT') 

儘管這樣做,我更喜歡@jezraels的方法,因爲我認爲它更清潔。