我想创建一个可以接受任何数据帧的函数,选择一个带有整数的列,如果指定的数字>指定的数字,则指定一个数字以过滤掉数据。
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
答案 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