如何根据其他列的函数选择/添加列到pandas数据帧?

时间:2015-01-12 22:04:31

标签: function select pandas add dataframe

我有一个数据框,我想选择符合某些条件的行。标准是其他列的值和一些其他值的函数。

这是一个玩具示例:

>>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的行,但我怀疑一旦您可以添加,您也可以选择)。

在没有明确迭代所有索引的情况下,是否有一种高效而优雅的方法? 谢谢!

2 个答案:

答案 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