Pandas dataframe eval fonksiyonu

pandas ile sütunlara arasında işlem yapmam gerekiyor ancak sütunları ve eval fonksiyonunda bulunan textleri kullanıcıdan alacağım. nasıl yapacağım ile ilgili bir yöntem bakıyorum.
örnek kod ile göstereyim

import pandas as pd
data = {
  "Wo men": [125, 230, 412],
  "Men": [219, 185, 452]
}
df = pd.DataFrame(data)
# kullanıcı kullanacağı sütunları seçecek  bende sütünlarla aşağıdaki gibi bir sozluk oluşturacağım.
d = {'A': 'Wo men', 'B': 'Men'}
# kullanıcı eval için text yazacak
t = "A + B"

d şu şekilde oluşacak

KEYS = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
d = dict(zip(KEYS,list(v.title for v in KULLANICININ_SEÇTİĞİ_OBJELER)))
# her sütun için oluşturulmuş bir obje var ve v.title sütun başlığına eşit

şu ifade düzgün çalışıyor:

print(pd.eval('df[A] + df[B]', engine='python', local_dict=d))

ama ben ilk parametreyi “A + B” şeklinde vermek istiyorum. df üzerinden fonksiyonu çağırdım. ama böyle olunca local dict gönderemiyorum.

print(df.eval("A + B", engine='python', local_dict=d))

şu yöntem bir çözüm gibi görünüyor; ancak pek sevimli görünmüyor.

t = "A + B"
for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
    t2 = t2.replace(letter, f"df[{letter}]")
print(pd.eval(t, engine='python', local_dict=d))

soru: ne yapmalıyım? bu işin best practice’i nedir?

işlemi belirli bir dataframe için yapmıyorum; dolayısıyla farklı başlıklar gelebilir. içinde space, *, (, } barındırabilir.

Örneğin:

import pandas as pd
import tkinter as tk

data = {
    "Wo men": [125, 230, 412],
    "Men": [219, 185, 452],
    "()egl kg gkel eh": [500, 600, 200],
    "29582952mf h1!egdlxz<z": [8, 1, 0]
}
df = pd.DataFrame(data)
root = tk.Tk()
listbox = tk.Listbox(master=root, selectmode="multiple", activestyle="none")
listbox.pack()
for index, col in enumerate(data):
    listbox.insert(index, col)
listbox.bind(
    sequence="<<ListboxSelect>>",
    func=lambda event: print(
      sum(map(lambda i: df[event.widget.get(i)], event.widget.curselection()))
    )
)
root.mainloop()

evet bu tip ifadeler olabilir.

Emeğiniz için teşekkür ederim. ancak eval fonksiyonu nasıl kullanacağımı sormak istemiştim. nasıl seçim yaptıracağımı değil. Aslında django kullanıyorum. o kısımları göstermeyip soruyu sadeleştirmek istemiştim.

bu ifade hatalı. local_dict gönderilemiyor. ama ben göndermek istiyorum.

df.eval fonksiyonu doğrudan sütunların isimlerini alıyor. Yani sütunlara A ve B harflerini atayamıyorsunuz. Ancak pd.eval fonksiyonunu kullanırsanız bu harfleri sütunları temsil etmesi için kullanabilirsiniz.

Aşağıdaki örneye bakın mesela:

import pandas as pd
import tkinter as tk
from string import ascii_uppercase

data = {
    "Wo men": [125, 230, 412],
    "Men": [219, 185, 452],
    "()egl kg gkel eh": [500, 600, 200],
    "29582952mf h1!egdlxz<z": [8, 1, 0]
}
df = pd.DataFrame(data)

root = tk.Tk()

listbox = tk.Listbox(master=root, selectmode="multiple", activestyle="none")
listbox.pack()
local_dict = {}
for index, col in enumerate(data):
    listbox.insert(index, col)
    local_dict[ascii_uppercase[index]] = col
listbox.bind(
    sequence="<<ListboxSelect>>",
    func=lambda event: print(
        pd.eval(
            " + ".join(map(lambda i: f"df[{ascii_uppercase[i]}]", listbox.curselection())),
            local_dict=local_dict
        )
    )
)

root.mainloop()