按值列表选择行而不使用多个和

时间:2016-03-02 10:12:02

标签: python pandas

我有一个包含(a,b,c)列的数据框。 我有一个值列表(x,y,z) 如何选择包含这三个值的行,如:

df = df[df[(a,b,c)] == (x,y,z)]

我知道

df = df[(df[a] == x) & (df[b] == y) & (df[c] == z)]

应该可行,但我正在寻找更方便的东西。它存在吗?

3 个答案:

答案 0 :(得分:2)

使用索引的解决方案

我会将列设置为索引并使用.loc函数

像这样的索引是访问行的最快方法,而对于较大的数据集,屏蔽速度非常慢。

In [4]: df = pd.DataFrame({'a':[1,2,3,4,5],
                           'b':['a','b','c','d','e'],
                           'c':['z','x','y','v','u'],
                           'othervalue':range(100, 105)})

In [5]: df
Out[5]: 
   a  b  c  othervalue
0  1  a  z         100
1  2  b  x         101
2  3  c  y         102
3  4  d  v         103
4  5  e  u         104

In [6]: df.set_index(['a','b','c'], inplace=True)

In [7]: df
Out[7]: 
       othervalue
a b c            
1 a z         100
2 b x         101
3 c y         102
4 d v         103
5 e u         104

In [8]: df.loc[[4,'d','v']]
Out[8]: 
       othervalue
a b c            
4 d v         103

额外奖金

此外,如果您只想访问特定列的某个值,则可以扩展.loc函数以访问该特定列,如下所示:

In [9]: df.loc[[4,'d','v'], 'othervalue']
Out[9]: 
a  b  c
4  d  v    103
Name: othervalue, dtype: int64

答案 1 :(得分:1)

如果你正在寻找匹配元组(x,y,z)值而不管列中的顺序(只是在同一行),也许我会使用isin作为:

df = df[df[['a','b','c']].isin([x,y,z])].dropna()

将时间与大数据帧上的布尔掩码进行比较会很好。

答案 2 :(得分:0)

df = [df['a'],df['b'],df['c']] == [x,y,z]

希望它会有所帮助