嗨,所以我为我的数据框创建了一个自定义访问器,它可以使输出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/