Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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为类对象分配不同的变量_Python_Python 3.x_Pandas_Oop_Object - Fatal编程技术网

Python为类对象分配不同的变量

Python为类对象分配不同的变量,python,python-3.x,pandas,oop,object,Python,Python 3.x,Pandas,Oop,Object,这是一个一般的python问题。是否可以为类对象分配不同的变量,然后对这些变量执行不同的操作集?我试图减少代码,但可能这不是它的工作方式。例如,我正在尝试这样做: 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 = pd.read_csv('dat

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

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 = 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)
编辑:下面是类和方法的摘要:

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 = 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)
df_1
df_2
应具有不同的值,但它们与
df_1
相同。如果我像这样使用类,这个问题就解决了:

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 = 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)

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

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

在这里:

1 df=pd.read\u csv('data.csv'))
2.
3 df=等级(df)
4 df=df.query(query).forward\u 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=然后返回
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)])
返回类(df)

致以最诚挚的问候

您能告诉我们
oper_1
oper_2
在做什么吗?它们是
pandas
数据帧操作,链接在一起显示
的定义,让我们重现错误。您还需要包括预期和观察到的输出。
2+5
3+4
也会产生相同的输出,但这并不意味着其中任何一个都是错误的。@chepner添加了类详细信息