使用连接字符串过滤pandas数据帧中的行

时间:2013-07-11 14:55:46

标签: python pandas

我有一个pandas数据帧和一个pandas系列标识符,并希望过滤数据框中与系列中的标识符相对应的行。要从数据帧中获取标识符,我需要连接它的前两列。我尝试过各种各样的东西来过滤,但到目前为止似乎都没有。这是我尝试过的:

1)我尝试在数据框中添加一列布尔值,如果该行对应于其中一个标识符则为true,否则为false(希望以后能够使用新列进行过滤):

df["isInAcids"] = (df["AcNo"] + df["Sortcode"]) in acids

,其中

acids

是包含标识符的系列。

然而,这给了我一个

TypeError: unhashable type

2)我尝试使用apply函数进行过滤:

df[df.apply(lambda x: x["AcNo"] + x["Sortcode"] in acids, axis = 1)]

这不会给我一个错误,但数据框的长度保持不变,因此它似乎不会过滤任何内容。

3)我添加了一个新列,其中包含连接的字符串/标识符,然后尝试过滤(参见Filter dataframe rows if value in column is in a set list of values):

df["ACIDS"] = df["AcNo"] + df["Sortcode"]
df[df["ACIDS"].isin(acids)]

但同样,数据帧不会改变。

我希望这是有道理的......

我可能出错的任何建议? 谢谢, 安

1 个答案:

答案 0 :(得分:3)

我认为你要求的东西如下:

In [1]: other_ids = pd.Series(['a', 'b', 'c', 'c'])

In [2]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'c', 'f']})

In [3]: df
Out[3]: 
  ids  vals
0   a     1
1   b     2
2   c     3
3   f     4

In [4]: other_ids
Out[4]: 
0    a
1    b
2    c
3    c
dtype: object

在这种情况下,系列other_ids就像您的系列acids。我们只想选择dfid系列other_ids中的行dataframe。为此,我们将使用.isin()的方法In [5]: df.ids.isin(other_ids) Out[5]: 0 True 1 True 2 True 3 False Name: ids, dtype: bool

In [6]: df[df.ids.isin(other_ids)]
Out[6]: 
  ids  vals
0   a     1
1   b     2
2   c     3

这给出了一列我们可以索引的bool:

df

这与您第3次尝试时的情况非常接近。一旦发布了数据帧的样本,我就可以编辑这个答案,如果它不起作用的话。

多读一点,你可能遇到了麻烦,因为Dataframe中有两列你的ids? isin没有In [26]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'f'], 'ids2': ['e', 'f', 'c', 'f']}) In [27]: df Out[27]: ids ids2 vals 0 a e 1 1 b f 2 2 f c 3 3 f f 4 In [28]: df.ids.isin(ids) + df.ids2.isin(ids) Out[28]: 0 True 1 True 2 True 3 False dtype: bool 方法,但我们可以用以下方法解决这个问题:

True

False类似于1,isins()就像零,所以我们从两个OR中添加两个布尔系列,以获得类似于In [29]: new = df.ix[df.ids.isin(ids) + df.ids2.isin(ids)] In [30]: new Out[30]: ids ids2 vals 0 a e 1 1 b f 2 2 f c 3 的操作。然后就像之前我们可以索引这个布尔系列:

{{1}}