2015-12-14 13 views
0

我有一個熊貓數據框,它具有在其第一次觀察點索引的窗口/鏈字符串觀察值。該窗口的大小可變。對於這個例子,我們可以說他們是4條觀察鏈。我想知道如何最有效地消除某些值,如果他們在窗口中的任何位置都有特定的觀測值,知道如果第n個窗口以我正在查找的值開始,我知道我可以將其刪除,並且三個窗口在它之前,因爲它們將在其窗口中稍後包含相同的值。窗口可能包含我想要過濾的值的多個實例。以下是一些示例數據。從一系列簡單事件開始,ser:在熊貓數據框中有效過濾窗口化觀察值(如果它們包含特定值)

import pandas as pd 
ser = pd.Series(['a','b','c','d','e','f','g','h','i','j','k']) 
>>> ser 
0  a 
1  b 
2  c 
3  d 
4  e 
5  f 
6  g 
7  h 
8  i 
9  j 
10 k 

然後我把它變成一個數據幀,其中每一行都是一個有n個觀測值的窗口。在這裏,n == 4

df = pd.concat([ser.shift(-x) for x in range(4)], axis=1) 
>>> df 
    0 1 2 3 
0 a b c d 
1 b c d e 
2 c d e f 
3 d e f g 
4 e f g h 
5 f g h i 
6 g h i j 
7 h i j k 
8 i j k NaN 
9 j k NaN NaN 
10 k NaN NaN NaN 

現在我想擺脫所有值 'F' 的任何地方,即各行的:

desired_output

0 1 2 3 
0 a b c d 
1 b c d e 
6 g h i j 
7 h i j k 
8 i j k NaN 
9 j k NaN NaN 
10 k NaN NaN NaN 

我想避免搜索整個數據框,因爲它只包含第一列的重複,而我對n的值可能有點長。在這個例子中,刪除以'c','d','e'和'f'開頭的列的最好方法是知道它們都會在某處包含'f'。之後,我將每行中的所有字符串合併爲一個值,但似乎應該更容易在此階段操縱數據,其中所有內容都位於不同的列中。這是熊貓0.16.0,必須在python 2.76和python 3.4上工作。謝謝!

回答

0

這是更有效的在連接前搜索只是原來的系列,NaN的替代值,然後刪除那些NaN的這是大熊貓廉價的操作。

ser = pd.Series(['a','b','c','d','e','f','g','h','i','j','k']) 
ser.replace('f', float('nan'), inplace=True) 
df = pd.concat([ser.shift(-x) for x in range(4)], axis=1) 
df.dropna(inplace=True) 

相比Beauvel上校的解決了這個具有能夠接受字符串作爲第一個參數的迭代和過濾器用於在同一時間多個字符串的優勢。另一個區別是它消除了所有可能存在問題的NA值,但在我的情況下是可取的。

2

你可以做,而無需搜索整個數據框:

import numpy as np 

ind = -np.arange(0, df.shape[1])+pd.Index(ser).get_loc('f') 
df.iloc[np.setdiff1d(ser.index, ind)] 

#Out[48]: 
# 0 1 2 3 
#0 a b c d 
#1 b c d e 
#6 g h i j 
#7 h i j k 
#8 i j k NaN 
#9 j k NaN NaN 
#10 k NaN NaN NaN 
+0

謝謝,但是這不是仍在搜索整個數據框? – Alex

+0

我編輯瞭解決方案,以避免整個搜索! –

+0

此解決方案引發「位置索引器超出界限」錯誤。您的原始答案(在編輯之前)有效,但它會搜索整個數據框。 – Alex