我想从子类Pandas 数据帧中重新排序数据帧列.

我从这个question中了解到,可能有一种更好的方法来go 掉数据帧的子类化,但我仍然在想如何处理这个问题.

如果没有子类化,我将以一种classic 的方式来实现:

import pandas as pd

data = {'Description':['mydesc'], 'Name':['myname'], 'Symbol':['mysymbol']}
df = pd.DataFrame(data)

df = df[['Symbol', 'Name', 'Description']]

但对于子类化,保持与classic 行为相同的行为不会对列进行重新排序:

import pandas as pd

class SubDataFrame(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self = self._reorder_columns()
    
    def _reorder_columns(self):
        first_columns = ['Symbol', 'Name', 'Description']
        return self[first_columns + [c for c in self.columns if c not in first_columns]]
    
data = {'Description':['mydesc'], 'Name':['myname'], 'Symbol':['mysymbol']}
df = SubDataFrame(data)

我相信我的错误在于重新分配了self人,这对我没有任何影响.

如何在子类化的数据帧上实现列重新排序?

推荐答案

参数为inplace的Pandas 方法使用私有方法_update_inplace.你也可以这样做,但一定要关注Pandas future 的发展,以防这种方法发生变化:

import pandas as pd

class SubDataFrame(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._update_inplace(self._reorder_columns())
    
    def _reorder_columns(self):
        first_columns = ['Symbol', 'Name', 'Description']
        return self[first_columns + [c for c in self.columns if c not in first_columns]]
    
data = {'Description':['mydesc'], 'Name':['myname'], 'Symbol':['mysymbol']}
df = SubDataFrame(data)

输出:

     Symbol    Name Description
0  mysymbol  myname      mydesc

Python相关问答推荐

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

如何从. text中进行pip安装跳过无法访问的库

除了Python之外,可以替代bare?

如何知道标志是否由用户传递或具有默认值?

使用多个性能指标执行循环特征消除

Pandas 在时间序列中设定频率

如何计算列表列行之间的公共元素

从webhook中的短代码(而不是电话号码)接收Twilio消息

'discord.ext. commanders.cog没有属性监听器'

如何删除索引过go 的lexsort深度可能会影响性能?' &>

2D空间中的反旋算法

根据二元组列表在pandas中创建新列

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

Python+线程\TrocessPoolExecutor

使用NeuralProphet绘制置信区间时出错

调用decorator返回原始函数的输出

如何合并两个列表,并获得每个索引值最高的列表名称?

启动带有参数的Python NTFS会导致文件路径混乱

导入错误:无法导入名称';操作';

Numpyro AR(1)均值切换模型抽样不一致性