应用函数然后过滤DataFrame

时间:2014-01-30 18:52:24

标签: python filter pandas

我目前正在尝试创建一个新列,然后过滤:

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

如果列条目为false,则将其提取出来。但是它不起作用并在此处创建错误:df['filterSalaryLoc'] = df[True if df['distance'] <= 25 & df['compensation_right'] else False]。任何人都知道出了什么问题?

2 个答案:

答案 0 :(得分: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

(注意这都是假的。)

答案 1 :(得分:0)

你可以试试这个:

使用df[(df.distance <= 25) & (df.compensation_right)]查找您的情况属实(您不需要[True if ... else False])。然后取出那些行(.index)并在这些索引处创建一个新列,在其他地方创建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]

使用False填充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]

如果您安装了pandas 0.13或更高版本,则第一行可以替换为:

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