копирование средства доступа к данным при использовании pd.df.copy () - PullRequest
1 голос
/ 30 сентября 2019

Привет, поэтому я создал собственный аксессор для своего информационного кадра, чтобы облегчить форматирование вывода при выводе 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.

Мой вопрос: как мне настроить его так, чтобы df.copy() также копировал аксессор css_formatting. Или я должен попробовать что-то другое?

edit: Чтобы добавить больше,

Я пытаюсь добавить

@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. Это также не делает то, что я хочу.

2nd Edit:

Я сделал болван об этом статическом методе

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

С учетом сказанного, я с радостью приму альтернативы, которые кто-нибудь предложит.

1 Ответ

1 голос
/ 30 сентября 2019

Вы можете создать метод копирования в классе доступа. Не уверен, что это имеет значение, но это работает для вашего варианта использования. Я канадец, поэтому я меняю цвет на цвет и сокращаю имя аксессора до '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...