我有一个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)]
但同样,数据帧不会改变。
我希望这是有道理的......
我可能出错的任何建议? 谢谢, 安
答案 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
。我们只想选择df
在id
系列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}}