Bir kullanıcı bir Pandas DataFrame veya Series nesnesine birkaç filtre uygulamak istediği bir senaryo var. Aslında, kullanıcı tarafından çalışma zamanında belirtilen bir grup filtreleme (karşılaştırma işlemleri) verimli bir şekilde zincirlemek istiyorum.
Filtreler katkı maddesi olmalıdır (yani uygulanan her biri sonuçları daraltmalıdır).
Şu anda kullanıyorum reindex()
ama bu her seferinde yeni bir nesne oluşturur ve temel verileri kopyalar (belgeleri doğru anlıyorsam). Bu nedenle, büyük bir Seri veya DataFrame'i filtrelerken bu gerçekten verimsiz olabilir.
Ben kullanarak o düşünüyorum apply()
, map()
ya da benzer bir şey daha iyi olabilir. Yine de her şey etrafında kafamı sarmaya çalışırken Pandalar için oldukça yeniyim.
TL; DR
Aşağıdaki formun sözlüğünü almak ve her işlemi belirli bir Series nesnesine uygulamak ve bir 'filtre' seri nesnesini döndürmek istiyorum.
relops = {'>=': [1], '<=': [1]}
Uzun Örnek
Şu anda sahip olduğum bir örnekle başlayacağım ve sadece tek bir Series nesnesini filtreleyeceğim. Şu anda kullandığım işlev aşağıdadır:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
Kullanıcı yapmak istediği işlemleri içeren bir sözlük sağlar:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12
>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1
Yine, yukarıdaki yaklaşımımdaki 'sorun', aradaki adımlar için verilerin çok fazla gereksiz kopyalanması olduğunu düşünüyorum.
Ayrıca, bu sözlüğü, sözlüğün, operatör için sütunları içerebilmesi ve giriş sözlüğüne dayalı olarak tüm bir DataFrame'i filtreleyebilmesi için genişletmek istiyorum. Ancak, ben dizi için ne işe yarıyor varsayalım kolayca bir DataFrame genişletilebilir.
df.query
ve pd.eval
kullanım durumunuza uygun görünüyor. pd.eval()
İşlevler ailesi, özellikleri ve kullanım örnekleri hakkında bilgi için , lütfen pd.eval () kullanarak pandalarda Dinamik İfade Değerlendirme sayfasını ziyaret edin .