我有一个数据框,我想选择符合某些条件的行。标准是其他列的值和一些其他值的函数。
这是一个玩具示例:
>>df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9],
'B': [randint(1,9) for x in xrange(9)],
'C': [4,10,3,5,4,5,3,7,1]})
>>
A B C
0 1 6 4
1 2 8 10
2 3 8 3
3 4 4 5
4 5 2 4
5 6 1 5
6 7 1 3
7 8 2 7
8 9 8 1
我希望选择某些函数返回true的所有行,例如如果乘法AxC在指定的列表L中,则f(a,c,L)返回true,例如L = [4,20,30](尽管该函数可能不那么简单)。也就是说,我想得到:
>>
A B C
0 1 6 4
1 2 8 10
3 4 4 5
4 5 2 4
5 6 1 5
同样,我想添加一个二,列,匹配的'这是真的是L中的AxC:
A B C matched
0 1 2 4 True
1 2 5 10 True
2 3 6 3 False
3 4 3 5 True
4 5 2 4 True
5 6 6 5 True
6 7 4 3 False
7 8 5 7 False
8 9 2 1 False
(添加此列后,您可以轻松选择所有具有True的行,但我怀疑一旦您可以添加,您也可以选择)。
在没有明确迭代所有索引的情况下,是否有一种高效而优雅的方法? 谢谢!
答案 0 :(得分:4)
使用isin
的矢量化解决方案:
In [5]:
L=[4,20,30]
df['Match'] = (df['A']*df['C']).isin(L)
df
Out[5]:
A B C Match
0 1 6 4 True
1 2 1 10 True
2 3 8 3 False
3 4 4 5 True
4 5 2 4 True
5 6 4 5 True
6 7 4 3 False
7 8 7 7 False
8 9 4 1 False
时序:
In [9]:
%%timeit
L=[4,20,30]
rowindex = df.apply(lambda x : True if (x['A'] * x['C']) in L else False, axis=1)
df.loc[rowindex,'match'] = True
df.loc[~rowindex,'match'] = False
100 loops, best of 3: 3.13 ms per loop
In [11]:
%%timeit
L=[4,20,30]
df['Match'] = (df['A']*df['C']).isin(L)
1000 loops, best of 3: 678 µs per loop
答案 1 :(得分:0)
这将返回一个布尔索引
L=[4,20,30]
df.apply(lambda x : True if (x['A'] * x['C']) in L else False, axis=1)
0 True
1 True
2 False
3 True
4 True
5 True
6 False
7 False
8 False
然后你可以做什么
rowindex = df.apply(lambda x : True if (x['A'] * x['C']) in L else False, axis=1)
df.loc[rowindex,'match'] = True
df.loc[~rowindex,'match'] = False
df
A B C match
0 1 7 4 True
1 2 3 10 True
2 3 9 3 False
3 4 5 5 True
4 5 9 4 True
5 6 2 5 True
6 7 2 3 False
7 8 7 7 False
8 9 6 1 False