是否有一种干净的方法来使用自定义函数过滤Pandas Series,该函数将索引和值作为输入?
这是一段实现我想要做的事情的代码:
series = pd.Series({"id5":88, "id3":40})
def custom(k,v):
if k=="id5":
return v>20
else:
return v>50
filtered_indexes = []
filtered_values = []
for k,v in series.iteritems():
if custom(k,v):
filtered_indexes.append(k)
filtered_values.append(v)
filtered_series = pd.Series(data=filtered_values, index=filtered_indexes)
我的问题是:使用
等语法可以实现更清晰和/或更高效series.filter(lambda x: custom(x.index, x.value))
答案 0 :(得分:1)
索引存在问题Series.apply
have no accesses,而Series
未实施DataFrame.filter
。
有可能,但需要创建DataFrame
:
s = series[series.to_frame().apply(lambda x: custom(x.name, x), axis=1).squeeze()]
print (s)
id5 88
dtype: int64
或者将groupby
与filtration:
s = series.groupby(level=0).filter(lambda x: custom(x.name, x)[0])
print (s)
id5 88
dtype: int64
答案 1 :(得分:0)
您可以按照以下方式将逻辑矢量化。这样可以避免低效的lambda
循环,也可以使代码更清晰。
res = series[((series.index == 'id5') & (series > 20)) |
((series.index != 'id5') & (series > 50))]
结果:
id5 88
dtype: int64
为了便于阅读,您可能希望将布尔条件分开:
c1 = ((series.index == 'id5') & (series > 20))
c2 = ((series.index != 'id5') & (series > 50))
res = series[c1 | c2]