首页 > 解决方案 > Python将不同的变量分配给类对象

问题描述

这是一个一般的python问题。是否可以将不同的变量分配给类对象,然后对这些变量执行不同的操作集?我正在尝试减少代码,但也许这不是它的工作方式。例如,我正在尝试做这样的事情:

编辑:这是类和方法的摘要:

class Class:
    def __init__(self, df):
        self.df = df

    def query(self, query):
        self.df = self.df.query(query)
        return self

    def fill(self, filter):
        self.df.update(df.filter(like=filter).mask(lambda x: x == 0).ffill(1))
        return self

    def diff(self, cols=None, axis=1):
        diff = self.df[self.df.columns[~self.df.columns.isin(cols)]].diff(axis=axis)
        self.df = diff.join(self.df[self.df.columns.difference(diff.columns)])
        return self

    def melt(self, cols, var=None, value=None):
        return pd.melt(self.df, id_vars=columns, var_name=var, value_name=value)

我正在尝试像这样使用它:

df = pd.read_csv('data.csv')

df = Class(df)
df = df.query(query).forward_fill(include)

df_1 = df.diff(cols).melt(cols)

df_2 = df.melt(cols)

df_1并且df_2应该具有不同的值,但是它们与df_1. 如果我使用这样的类,这个问题就解决了:

df_1 = pd.read_csv('data.csv')
df_2 = pd.read_csv('data.csv')

df_1 = Class(df_1)
df_2 = Class(df_2)

df_1 = df_1.query(query).forward_fill(include)
df_2 = df_2.query(query).forward_fill(include)

df_1 = df_1.diff(cols).melt(cols)

df_2 = df_2.melt(cols)

这会导致额外的代码。有没有更好的方法来做到这一点,您可以在不同的变量上以不同的方式使用对象,或者如果我试图让两个变量执行单独的操作并返回不同的值,我是否必须创建单独的对象?

标签: pythonpython-3.xpandasoopobject

解决方案


使用- 方法return self中的语句diff返回对象的引用。同样的事情发生在melt方法之后。但是在这两种方法中,你已经操纵了原点df

这里:

1 df = pd.read_csv('data.csv')
2
3 df = Class(df)
4 df = df.query(query).forward_fill(include)
5 
6 df_1 = df.diff(cols).melt(cols)

具有df与 相同的值df_1。我猜melt没有其他参数的方法然后 cols 参数只分配 col 名称或类似的东西。随后df_2=df.melt(cols)会有相同的结果,如df_2=df_1.melt(cols).

如果你想使用一个对象,你不应该self.df=...在你的类方法中使用,因为这会改变df. 你只需要写df = ... 而不是 return Class(df)

例如:

def diff(self, cols=None, axis=1):
    diff = self.df[self.df.columns[~self.df.columns.isin(cols)]].diff(axis=axis)
    df = diff.join(self.df[self.df.columns.difference(diff.columns)])
    return Class(df)

此致


推荐阅读