2015-12-14 50 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

相关问题