嗨,所以我为我的数据框创建了一个自定义访问器,它可以使输出html或excel时的输出格式更容易。

import pandas as pd

@pd.api.register_dataframe_accessor("css_formatting")
class DataFrameFormatsAccessor(object):
   def __init__(self, pandas_obj):
      self._obj = pandas_obj
      idx = self._obj.index
      col = self._obj.columns
      self.background_color = pd.DataFrame("white", index=idx,columns=col)
   @property
   def background_color(self):
      return self._background_color


然后我尝试这样的事情

import pandas as pd

df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
>>> df
  A B
0 1 4
1 2 5
2 3 6
>>> df.css_formatting.background_color
      A     B
0 white white
1 white white
2 white white
>>> df.css_formattig.background_color.iloc[0,0] = 'red'
>>>df.css_formatting.background_color
      A     B
0   red white
1 white white
2 white white
>>> df2 = df.copy()
>>> df2.css_formatting
      A     B
0 white white
1 white white
2 white white


现在我想我明白为什么会这样。每次创建新数据框并初始化css_formatting访问器时,都会使background_colors成为大小相等且值为white eveything的数据框。

我的问题是,如何设置它,以便df.copy()也复制css_formatting访问器。还是我有其他尝试要做的事情?

编辑:要添加更多,

我尝试添加

@staticmethod
def copy_formatting(self,other):
   self.background_color = other.css_formatting.background_color
   return


在执行我在原始OP中所做的操作后,然后尝试以下操作

df2.css_formatting.copy_formatting(df2,df)


并且我收到Pandas doesn't allow columns to be created via a new attribute name的警告。它也没有做我想要的。

第二次编辑:

我对那个静态方法做了一个booboo

@staticmethod
def copy_formatting(self,other):
   self.css_formatting.background_color = other.css_formatting.background_color
   return


话虽这么说,我很乐意采用任何人都建议的替代方法。

最佳答案

您可以在访问器类中创建一个复制方法。不知道这是否有影响,但是它适用于您的用例。我是加拿大人,所以我要改变颜色,并将访问器名称缩写为'css':

@pd.api.extensions.register_dataframe_accessor("css")
class DataFrameFormatsAccessor(object):
    def __init__(self, pandas_obj):
       self._obj = pandas_obj
       self._background_colour = pd.DataFrame("white",
                                              index=self._obj.index,
                                              columns=self._obj.columns)

    def copy(self):
        return self._obj

    @property
    def background_colour(self):
       return self._background_colour

    @background_colour.setter
    def background_colour(self, args):
        i, j, colour = args
        self._background_colour.iloc[i, j] = colour


测试:

df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
print(df.css.background_colour)
       A      B
0  white  white
1  white  white
2  white  white

df.css.background_colour = (1,1,'green')
print(df.css.background_colour)
       A      B
0  white  white
1  white  green
2  white  white

dff = df.css.copy()
print(dff.css.background_colour)
       A      B
0  white  white
1  white  green
2  white  white

dff.css.background_colour = (2,1,'red')
print(dff.css.background_colour)
       A      B
0  white  white
1  white  green
2  white    red

关于python - 使用pd.df.copy()时复制数据帧访问器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58168304/

10-12 23:24