gpt4 book ai didi

python - 导入类时NameError DataFrame未定义

转载 作者:行者123 更新时间:2023-12-01 00:36:19 24 4
gpt4 key购买 nike

我最近了解了 np.select 操作,并决定创建一个类来试验它,并进一步了解 OOP。

这里是我的类的定义,后面是一个示例(该类使用开头定义的 translate 函数):

def translate(text, conversion_dict, before = None):
if not text: return text
before = before or str.lower
t = before(text)
for key, value in conversion_dict.items():
t = t.replace(key, value)
return t

class Conditions:
def __init__(self, base_conditions, composed_conditions, groups, default_group):
self.base_conditions = base_conditions
self.composed_conditions = composed_conditions
self.groups = groups
self.default_group = default_group
self.readable_conditions = [translate(c, self.base_conditions) for c in self.composed_conditions]
self.ok_conditions = []

def run_condition(self, condition, df_name):
return eval(condition.replace("(","("+str(df_name)+"."))

def run_conditions(self, df_name):
return [self.run_condition(c, df_name) for c in self.readable_conditions]

示例

首先,我们创建一个简单的 DataFrame 来使用:

import pandas as pd
import numpy as np

example = {"lev1" : [-1, -1, -1, 1, 0 , -1, 0 , 3],
"lev2" : [-1, 0 , 1 , 5 , 0 , 7 , 8 , 6]}

ex_df = pd.DataFrame.from_dict(example)
print(ex_df)

lev1 lev2
0 -1 -1
1 -1 0
2 -1 1
3 1 5
4 0 0
5 -1 7
6 0 8
7 3 6

接下来,我们创建一个类的新实例,在其中传递条件和组:

mycond = Conditions({"(m1)" : "(lev1 < 0)",
"(m2)" : "(lev2 > 2)",
"(m3)" : "(lev1 == 0)"},
["(m1)", "(m2) & (m3)", "(m2)"],
['A', 'B', 'C'],
999)

最后,我们在 ex_df DataFrame 上使用 np.select 操作并打印结果:

ex_df['MATCH'] = np.select(condlist = mycond.run_conditions("ex_df"), 
choicelist = mycond.groups,
default = mycond.default_group)
print(ex_df)

lev1 lev2 MATCH
0 -1 -1 A
1 -1 0 A
2 -1 1 A
3 1 5 C
4 0 0 999
5 -1 7 A
6 0 8 B
7 3 6 C

正如您所看到的,除了一个异常(exception)之外,一切都运行良好。

当我尝试从单独的文件(conditions.py,其中还包含翻译函数)导入我的类时,它不再起作用。以下是我的文件夹/文件的组织方式:

├── classes
│ ├── __init__.py
│ └── conditions.py
└── test-notebook.ipynb

在我的 test-notebook.ipynb 中,我以通常的方式导入我的类(有效):

from classes.conditions import *

然后,在创建我的 DataFrame 后,我创建了我的类的一个新实例(也可以工作)。最后,当运行 np.select 操作时,会引发以下 NameError:name 'ex_df' 未定义

我不知道为什么会输出错误以及如何修复它。我正在寻找为什么如何的答案。如果需要的话,这是错误的回溯:

---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-7-1d4b3ba4a3c0> in <module>
----> 1 ex_df['MATCH'] = np.select(condlist = mycond.run_conditions("ex_df"),
2 choicelist = mycond.groups,
3 default = mycond.default_group)
4 print(ex_df)

~/Projects/test/notebooks/classes/conditions.py in run_conditions(self, df_name)
20
21 def run_conditions(self, df_name):
---> 22 return [self.run_condition(c, df_name) for c in self.readable_conditions]

~/Projects/test/notebooks/classes/conditions.py in <listcomp>(.0)
20
21 def run_conditions(self, df_name):
---> 22 return [self.run_condition(c, df_name) for c in self.readable_conditions]

~/Projects/test/notebooks/classes/conditions.py in run_condition(self, condition, df_name)
17
18 def run_condition(self, condition, df_name):
---> 19 return eval(condition.replace("(","("+str(df_name)+"."))
20
21 def run_conditions(self, df_name):

~/Projects/test/notebooks/classes/conditions.py in <module>

NameError: name 'ex_df' is not defined

最佳答案

在您的上下文中,变量ex_df无法作为全局或局部变量访问,即函数run_conditions知道名称“ex_df”但不知道它是什么。

您需要传递对 DataFrame 的引用而不是其名称:

ex_df['MATCH'] = np.select(condlist = mycond.run_conditions(ex_df), 
choicelist = mycond.groups,
default = mycond.default_group)

然后更改 run_condition 的定义以接受 DataFrame 而不是变量名称:

def run_condition(self, condition, df):
return eval(condition.replace("(","(df."))

def run_conditions(self, df):
return [self.run_condition(c, df) for c in self.readable_conditions]

说明:在函数run_condition的上下文中,变量名称为df。没有“ex_df” - 这就是你在其他地方调用它的方式。此时运行 eval(),解释器通过该名称知道 df,它是函数的参数。

关于python - 导入类时NameError DataFrame未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57740110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com