Python为类对象分配不同的变量
这是一个一般的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
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添加了类详细信息