【问题标题】:Using classes to drop columns from dataframe使用类从数据框中删除列
【发布时间】:2020-12-16 12:00:33
【问题描述】:

我正在努力减少数据框中不需要的数据列,但让它在 OOP 的范围内工作。数据框中的列从“A”到“M”。

例子:

import pandas as pd

# columns 'A' 'B' and 'C' are what I want kept
vibe_df = pd.read_csv('C:Location/Document.csv')
vibe_df = vibe_df[['DateTime', 'A', 'B', 'C']]

以上方法可行,但是,我想使用 OOP

import pandas as pd

class MemoryVibes:
    def __init__(self,dataframe):
        self.dataframe = dataframe
     
    def keep_only_column(dataframe):
        dataframe = dataframe[['DateTime', 'A', 'B', 'C']]

MemoryVibes.keep_only_column(vibe_df)

vibe_df

没有抛出任何错误,但所有列仍然存在。请告知,因为我的编码经验仍处于初级阶段。

【问题讨论】:

  • 您需要从self.dataframe 中删除列,然后将返回的DataFrame 分配给self.dataframe,即self.dataframe = self.dataframe[['DateTime', 'A', 'B', 'C']]。从帖子中不清楚您是打算修改最初传入的数据框还是必须在函数中传递的数据框。

标签: python-3.x pandas dataframe oop


【解决方案1】:

这里的问题是你永远不会改变vibe_df 的值。当您将值传递给keep_only_column 时,您只是在访问数据框并存储特定的行。按照这里的代码,最接近当前架构的解决方案是简单地返回访问列:

def keep_only_column(dataframe):
        return dataframe[['DateTime', 'A', 'B', 'C']]

话虽如此,如果您有一个严格由没有共享状态的静态类组成的类,最好将这些方法提取到 module 并导入所需的方法。

“正确的”OOP 解决方案是创建MemoryVibes 类的实例,修改keep_only_column 以改变实例状态,并在那里访问改变后的值。

class MemoryVibe:
    def __int__(self, dataframe):
        self.dataframe = dataframe
        # self.dataframe = self.dataframe[['DateTime', 'A', 'B', 'C']]

    def keep_only_column():
        self.dataframe = self.dataframe[['DateTime', 'A', 'B', 'C']]

mvibe = MemoryVibe(vibe_df)
mvibe.keep_only_column()

print(mvibe.dataframe)

最好直接将self.dataframe 的值实例化为仅在__init__ 中包含带有self.dataframe = dataframe[['DateTime', 'A', 'B', 'C']] 的所需列,并删除keep_only_columns,这样您就可以确保始终拥有正确的实例化后无需调用另一个函数的数据帧。

class MemoryVibe:
    def __int__(self, dataframe):
        self.dataframe = self.dataframe[['DateTime', 'A', 'B', 'C']]

【讨论】:

  • 谢谢伙计...这解决了我一直没有解决的问题。
猜你喜欢
  • 2017-02-13
  • 2017-10-28
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多