Python 将变量存储为另一个变量的属性是否是一种良好的做法?

Python 将变量存储为另一个变量的属性是否是一种良好的做法?,python,pandas,dataframe,variables,storage,Python,Pandas,Dataframe,Variables,Storage,我最近开始将变量(如X_-train、y_-train、X_-test、y_-test)存储为其完整数据帧的属性。当我同时使用多个数据集时,它帮助我组织了不同的培训和测试数据集。这通常被认为是良好/正常的做法吗?下面是一个例子: 我最初的了解方式是: X_train, X_test, y_train, y_test = train_test_split(some_dataframe[features],\ some_dataframe[target] 我最近开始做的事情是: some_

我最近开始将变量(如X_-train、y_-train、X_-test、y_-test)存储为其完整数据帧的属性。当我同时使用多个数据集时,它帮助我组织了不同的培训和测试数据集。这通常被认为是良好/正常的做法吗?下面是一个例子:

我最初的了解方式是:

X_train, X_test, y_train, y_test = train_test_split(some_dataframe[features],\
    some_dataframe[target]
我最近开始做的事情是:

some_dataframe.X_train, some_dataframe.X_test,\
    some_dataframe.y_train, some_dataframe.y_test = \
    train_test_split(some_dataframe[features], some_dataframe[target]

tl;dr:如果找不到真正好的理由,请避免合并。

我认为你所做的是所谓的“坏机会”的一部分

由于我无法了解您选择的所有细节,我并不是说这是一个坏主意,但您对问题的描述似乎指向了一个关于将不同数据源合并在一起的常见问题

您想要的是将所有数据重新组合到一个数据结构中,以区别于其他数据源,因此我想您认为为什么不使用已经可用的数据,为什么不使用我刚才使用的这个“模糊相关”数据框架

但您应该问问自己,为什么这个数据结构与您想要实现的目标相关?什么使它成为正确的数据结构?您是否要将此df的先前数据与新数据一起使用?或者你只是因为它“在那里”才选择这个结构

如果您没有理由专门使用此数据帧,我只需创建一个新的数据结构,可能一个字典就足够了。 就您的具体情况而言,原因如下:

  • 数据帧可能是您所寻找的内容的过度调整

  • 通过将不同的东西放在一起(例如,现在数据帧的维度是多少?有多少行?),您失去了以前数据帧的一些好属性

  • 人们/您可能会混淆数据框架的不同部分。例如,当您改变数据时,您确定您知道转换将应用于哪些数据吗?您是否还记得哪些数据是“原始”数据框的一部分,以及之后添加了哪些数据

  • 总之,在一个结构(概念)中融合不同的数据(或一般的想法)总是有风险的,你应该总是有充分的理由,而不仅仅是因为你可以


    附言:将评论中@roganjosh提出的问题视为当你开始将原本不应该存在的东西组合在一起时出现的问题的好例子。

    我对你的问题感到困惑
    some_dataframe.X_train
    是指一个列的语法。我想你对“方法”和“属性”之间的区别也有些困惑,这使得你问的问题不那么清楚。我认为我们需要更多的代码来准确理解您正在实现什么。请提供一个我更喜欢由df和这些其他属性组成的包装类。好的一点@roganjosh,实际上熊猫数据帧不是一个“常规python对象”,因为它有一些人们期望的补充属性。通过按此处的方式添加属性,您可以打破熊猫数据帧附带的“契约”。所以你有一个很好的理由这么做…@roganjosh这不是语法上的模糊或任何东西。数据帧可能会重载其
    \uuuu getattr\uuuu
    ,以检查属性是否对应于列,然后返回它,或者引发属性错误。但是设置属性仍然可以像其他python对象一样工作。他们为什么这么做,可能是因为对于数据分析的用例来说,它很方便。很多非软件工程师使用熊猫(pandas)进行数据分析,而不是构建高质量的代码库。我认为你是对的。但是一个小的修正——添加属性不会改变原始数据帧。所以您的原始数据保持不变,但您可以作为原始数据框的属性访问更改后的数据框。@JoeB技术上是这样的,因为它仍然是同一个对象,但现在您只是在侧面栓接了一个属性。如果我继承了一个代码库,只是看到
    一些_dataframe.X_train
    四处浮动,然后我发现这是一个附加属性,而不是我勉强接受的dataframe列的语法,我不会太高兴。我认为我们要说的是,我们对语法所代表的内容有一些期待,而不是试图说现有数据以任何方式发生了更改