使用熊猫使用>或<过滤值

时间:2019-07-16 19:04:05

标签: python pandas csv dataframe filter

我想创建一个可以接受任何数据帧的函数,选择一个带有整数的列,如果指定的数字>指定的数字,则指定一个数字以过滤掉数据。

def findFilter(df, transType, columnName=None, filterNumber=None):
            if transType == 'filter<>':
             if filterOperator == '>':
            dfNew = df[~(df[columnName] > filterNumber)]
            return dfNew

这将不返回任何值,而是返回值大于给定数字的行。

例如,如果我输入columnName = days filterNumber = 6

day      month
1        Jan
4        May
7        Jul
9        Sept

我想返回:

day      month
7        Jul
9        Sept

4 个答案:

答案 0 :(得分:2)

要回答这个问题...

您遇到一些问题:

  • 您在函数顶部遇到if流浪情况
  • 您在函数内使用filterOperator,但在函数定义中定义了transType
  • 使用~会否定您的条件,因此,您无需查找记录> filterNumber,而是查找记录< filterNumber

此修改后的函数适用于每个示例,并且可以根据需要进行完善:

def findFilter(df, filterOperator, columnName=None, filterNumber=None):
        if filterOperator == '>':
            dfNew = df[(df[columnName] > filterNumber)]
            return dfNew
        else:
            print('Error')
            return None

findFilter(df, ">", "day", 6)

但是有更好的方法...

也就是说,在熊猫中,有很多简单的方法可以做到这一点-例如df.loc[df['day'] > 6]

答案 1 :(得分:1)

尝试

df[df['day'] > 6]

这将按“天”列大于6的行进行过滤。

答案 2 :(得分:0)

尝试一下:

def findFilter(df, filterOperator='>', columnName=None, filterNumber=0):
    if filterOperator == '>':
        dfNew = df[df[columnName] > filterNumber]
    return dfNew

df = pd.DataFrame([[1, 'Jan'], [4, 'May'], [7, 'Jul'], [9, 'Sept']], columns=['day', 'month'])

df = findFilter(df, '>', 'day', 6)
print(df.head())

# or without the function
df = df[df['day'] > 6]
print(df.head())

答案 3 :(得分:0)

您可以通过getattr灵活地进行多种类型的比较,因为Series具有所有基本比较运算符作为属性。我更改了参数顺序,以使其更清楚地理解。

def findFilter(df, columnName=None, filterOperator='gt', filterVal=None):
    """
    filterOperator : str {'gt', 'ge', 'eq', 'lt, 'le', 'isin'}
    filterVal : numeric (list if filterOperator == 'isin')
    """
    return df[getattr(df[columnName], filterOperator)(filterVal)]

findFilter(df, 'day', 'gt', 6)
#   day month
#2    7   Jul
#3    9  Sept

它甚至可以采用其他几种方法

findFilter(df, 'month', 'isin', ['Jan', 'Jul'])
#   day month
#0    1   Jan
#2    7   Jul