2014-01-30 3 views
3

В настоящее время я пытаюсь создать новый столбец затем фильтровать по:Применить функцию затем фильтр DataFrame

df['filterSalaryLoc'] = df[True if df['distance'] <= 25 & df['compensation_right'] else False] 

Это как DF Смотрит:

 distance  compensation_right 
1  20.299433   True 
2  1014.258732  True 
3  1027.524228  True 
4  5556.81612  True 
5  926.003129  True 
6  19.832819   True 
7  1.489066   True 
8  434.355273  True 
9  23.647016   True 

Где, если запись столбца является ложным , то он будет извлечен. Однако он не работает и создает ошибку здесь: df['filterSalaryLoc'] = df[True if df['distance'] <= 25 & df['compensation_right'] else False]. Кто-нибудь знает, что происходит не так?

+0

Попробуйте положить круглые скобки вокруг первой части вашего состояния: 'if (df ['distance'] <= 25) & df ['compensation_right']'. – BrenBarn

+0

У меня все еще есть ошибка значения: ValueError: Значение истины серии неоднозначно. Используйте команды a.empty, a.bool(), a.item(), a.any() или a.all() – redrubia

ответ

0

Вы можете попробовать это:

Найти где ваше условие истинно с df[(df.distance <= 25) & (df.compensation_right)] (вам не нужно [True if ... else False]). Затем возьмите эти строки (.index) и создайте новый столбец True по этим индексам и NaN везде.

In [7]: df.loc[df[(df.distance <= 25) & (df.compensation_right)].index, 'filterSalaryLoc'] = True 

In [8]: df 
Out[8]: 
     distance compensation_right filterSalaryLoc 
1 20.299433    True   True 
2 1014.258732    True    NaN 
3 1027.524228    True    NaN 
4 5556.816120    True    NaN 
5 926.003129    True    NaN 
6 19.832819    True   True 
7  1.489066    True   True 
8 434.355273    True    NaN 
9 23.647016    True   True 

[9 rows x 3 columns] 

Заполните NaN с с Ложные:

In [9]: df.filterSalaryLoc.fillna(False, inplace=True) 

In [10]: df 
Out[10]: 
     distance compensation_right filterSalaryLoc 
1 20.299433    True   True 
2 1014.258732    True   False 
3 1027.524228    True   False 
4 5556.816120    True   False 
5 926.003129    True   False 
6 19.832819    True   True 
7  1.489066    True   True 
8 434.355273    True   False 
9 23.647016    True   True 

[9 rows x 3 columns] 

Если у вас есть панд 0.13 или более поздней версии, то первая строка может быть заменена:

In [13]: df.loc[df.query('distance <= 25 and compensation_right').index, 'filterSalaryLoc'] = True 
2

Я думаю, что, возможно, вы могли бы выполните следующее задание:

In [10]: df['filterSalaryLoc'] = (df['distance']<=25) & (df['compensation_right']) 

In [11]: df 
Out[11]: 
     distance compensation_right filterSalaryLoc 
0 20.299433    True   True 
1 1014.258732    True   False 
2 1027.524228    True   False 
3 5556.816120    True   False 
4 926.003129    True   False 
5 19.832819    True   True 
6  1.489066    True   True 
7 434.355273    True   False 
8 23.647016    True   True 

Скобки необходимы на правой стороне, так как без них df['distance']<=25 & df['compensation_right'] анализируется как

In [18]: df['distance']<=(25 & df['compensation_right']) 
Out[18]: 
0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
6 False 
7 False 
8 False 
dtype: bool 

(Обратите внимание, это все ложные.)

+0

намного чище, чем мое решение. Я не уверен, почему я чувствовал необходимость индексировать результат из запроса, а не просто назначать его. – TomAugspurger

Смежные вопросы