![](/img/trans.png)
[英]How to assign different variables to a class object using for loop?
[英]Python assign different variables to a class object
这是一个一般的 python 问题。 是否可以将不同的变量分配给 class object,然后对这些变量执行不同的操作集? 我正在尝试减少代码,但也许这不是它的工作方式。 例如,我正在尝试做这样的事情:
编辑:这是 class 和方法的摘要:
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
相同。 如果我像这样使用 class,这个问题就解决了:
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)
这会导致额外的代码。 有没有更好的方法可以做到这一点,您可以在不同的变量上以不同的方式使用 object,或者如果我试图让两个变量执行单独的操作并返回不同的值,我是否必须创建单独的对象?
使用diff
- 方法中的return self
语句返回 object 的引用。 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 arguments 只分配 col 名称或类似的东西。 随后df_2=df.melt(cols)
将具有与df_2=df_1.melt(cols)
相同的结果。
如果您想使用一个 object,则不应在 class 方法中使用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)
此致
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.