如何对子类 pandas Dataframe 上的列重新排序

问题描述 投票:0回答:1

我想从子类 pandas 数据帧中重新排序数据帧列。

我从这个问题了解到可能有更好的方法来不子类化数据框,但我仍然想知道如何解决这个问题。

如果没有子类化,我会用经典的方式来做:

import pandas as pd

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

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

但是通过子类化,保持与经典行为相同的行为不会对列进行重新排序:

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
,这没有任何效果。

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

python pandas dataframe subclass
1个回答
1
投票
具有

inplace

 参数的 
Pandas 方法使用私有方法
_update_inplace
。您也可以这样做,但请务必遵循未来的 pandas 开发,以防此方法发生变化:

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
© www.soinside.com 2019 - 2024. All rights reserved.