使用索引和值过滤Pandas系列

时间:2018-03-23 09:42:27

标签: python python-3.x pandas

是否有一种干净的方法来使用自定义函数过滤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))

2 个答案:

答案 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

或者将groupbyfiltration

一起使用
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]