我正在编写一个函数,该函数将用作我要使用的行的过滤器。 示例数据帧如下:
df = pd.DataFrame()
df ['Xstart'] = [1,2.5,3,4,5]
df ['Xend'] = [6,8,9,10,12]
df ['Ystart'] = [0,1,2,3,4]
df ['Yend'] = [6,8,9,10,12]
df ['GW'] = [1,1,2,3,4]
def filter(data,Game_week):
pass_data = data [(data['GW'] == Game_week)]
当我如下回忆函数过滤器时,出现错误。
df1 = filter(df,1)
错误消息是
AttributeError: 'NoneType' object has no attribute 'head'
但是当我使用手动过滤器时,它可以工作。
pass_data = df [(df['GW'] == [1])]
这是我的第一个问题。
我的第二个问题是我想过滤具有多个GW(1,2,3)等的行。
为此,我可以手动执行以下操作:
pass_data = df [(df['GW'] == [1])|(df['GW'] == [2])|(df['GW'] == [3])]
如果我想在函数输入中用作列表[1,2,3] 如何在函数中编写它,以便可以输入1到3的范围?
有人可以建议吗?
谢谢
Zep
答案 0 :(得分:1)
因为您没有在函数中使用return
,所以它将是None
,而不是所需的数据帧,请这样做(请注意,data[...]
内也不需要括号):
def filter(data,Game_week):
return data[data['GW'] == Game_week]
此外,isin
可能更好:
def filter(data,Game_week):
return data[data['GW'].isin(Game_week)]
答案 1 :(得分:1)
使用isin
来传递值列表而不是标量,filter
也是python中的现有函数,因此更改函数名称更好:
def filter_vals(data,Game_week):
return data[data['GW'].isin(Game_week)]
df1 = filter_vals(df,range(1,4))
答案 2 :(得分:1)
使用return
从函数的第一部分返回数据。对于第二个,使用-
def filter(data,Game_week):
return data[data['GW'].isin(Game_week)]
现在应用filter
函数-
df1 = filter(df,[1,2])