python - 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)
这会导致额外的代码。有没有更好的方法来做到这一点,您可以在不同的变量上以不同的方式使用对象,或者如果我试图让两个变量执行单独的操作并返回不同的值,我是否必须创建单独的对象?
解决方案
使用- 方法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)
此致
推荐阅读
- powershell - 仅运行变量但变量未“捕获”的 powershell 脚本
- python-3.x - 为 Cloud SQL API 获取 Google Cloud 访问令牌以在 Cloud Function 中导入 CSV
- python - Python2.7中的多处理
- chef-infra - 如何应用我在 Chef 的 Run_list 中包含的食谱?
- verilog - 为什么我的输出没有被赋值?
- string - 如何在 Elixir 中将 BitString 转换为字符串?
- javascript - React.js Hooks: TypeError: Object(...) is not a function
- vim - 如何设置和取消设置所有缓冲区的相对编号?
- macos - 为什么我的 $PATH 会在其中显示 anaconda 和其他奇怪的东西?
- makefile - 使用从 gcc -MM 生成的规则时,Make 会创建空依赖项