Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python/pandas-多重索引-消除全局变量的使用_Python_Pandas_Dataframe_Indexing_Global Variables - Fatal编程技术网

python/pandas-多重索引-消除全局变量的使用

python/pandas-多重索引-消除全局变量的使用,python,pandas,dataframe,indexing,global-variables,Python,Pandas,Dataframe,Indexing,Global Variables,我使用pandas从excel导入数据框,以便对数据进行排序、更改和简单的加法和除法 我的代码正在运行,但它始终具有全局变量。我认为这是一个糟糕的做法,我想以某种方式消除这些全局变量,但我不知道如何才能做到这一点 我不知道如何在不声明全局变量的情况下,通过索引和切片进一步修改数据帧 mydf = pd.read_excel('data.xlsx') new_indexes = df.set_index(['apple', 'cherry', 'banana']) new_indexes['a

我使用pandas从excel导入数据框,以便对数据进行排序、更改和简单的加法和除法

我的代码正在运行,但它始终具有全局变量。我认为这是一个糟糕的做法,我想以某种方式消除这些全局变量,但我不知道如何才能做到这一点

我不知道如何在不声明全局变量的情况下,通过索引和切片进一步修改数据帧

mydf = pd.read_excel('data.xlsx')

new_indexes = df.set_index(['apple', 'cherry', 'banana'])

new_indexes['apples and cherries'] = new_indexes['apple'] + new_indexes['cherries']

sliced = multi.loc(axis = 0)[pd.IndexSlice[:, 'fruits']]

total_fruits = sliced.loc[:, 'grapes', 'watermelon', 'orange'].sum(axis=1)
这是我的代码片段。如您所见,我引用全局变量是为了进一步修改我的数据帧。我需要消除全局变量。我试图创建函数来帮助清理代码

我的主要问题是,在不为代码分配全局变量的情况下,如何引用数据和更改

如果我想定义一个类并将变量重新分配给属性,我能这样做吗

class MyDf:

    def __init__(self):
        pass

    def get_df(self):
        return pd.read_excel('data.xlsx')
    
    def set_index(self):
        self._multi_index = df.set_index(['apple', 'cherry', 'banana']) 

    def add_totals(self)
        self.set_indexes['apples and cherries'] = set_indexes['apple']+ new_indexes['cherries']

 

谢谢

根据代码的总体结构和目标,您可以做几件事。如果不了解更多关于您的案例的信息,例如,不了解您提供的代码片段是如何嵌入到其余代码中的,那么这些都是唯一可能的解决方案

您可以定义一个函数,使其以数据帧作为参数,对其执行操作,然后返回修改后的数据帧。函数也可以简单地将文件名作为参数,以便在函数中创建相应的df。如果您不需要在代码后面引用中间变量,例如
new_index
sliced
,那么使用函数执行操作可能是一个好方法


您还可以定义一个,将变量转换为该类对象的属性,并编写方法来执行您想要执行的相应操作。这样做的好处是,如果需要,您仍然可以访问变量。

感谢您的回复。如何定义类选项?我对如何将这些变量更改为该类的属性感到困惑。我将在原始帖子中更新我的代码。在您的第二个代码片段中,
get_df(self)
将返回一个数据帧,而不是将其作为类属性。要更改此设置,请将返回pd.read\u excel('data.xlsx')替换为
self.df=pd.read\u excel(data.xlsx')
。另外,您的方法当前没有将
df
作为类属性(
self.df
)引用。最后,请注意,类属性当前是硬编码的。虽然如果该类的使用是一次性的,这可能不是问题,但是相应地更改方法以允许为每个类对象单独分配属性可能是更好的选择。如果我想修复我的类属性,使它们不再是硬编码的,我会在_ini__;(self)中声明它们吗?谢谢你迄今为止的帮助!这可以在
\uuuu init\uuuu()
或类的常规方法中完成。我认为在您的情况下,执行
\uuuuu init\uuuuu(self,filename):self.df=pd.read\u excel(str(filename))
可能是有意义的,这样每个类对象都已经用df初始化了。然后,您可以更改其他方法,以便它们将操作的细节作为参数(例如,
set\u index
中的索引标签)。这样,您就不必在初始化类对象时提供所有参数。谢谢,这很有意义。我应该在我的_init中包含任何其他属性吗?这确实取决于手头的情况,但至少对于您的示例,我认为将其留在df是合理的,因为它是所有方法的核心。