我将通过使用 pd.DataFrames 来问这个问题,因为使用它们会出现问题。但它可以推广到 python 中的可变对象。
我想创建一个值不同的 DataFrame 列表。目前我这样做:
data = pd.DataFrame(np.full((2, 2), 0), columns=['A', 'B'])
list_of_frames = []
for i in range(3):
tmp = data.copy()
tmp.loc[0, 'A'] = i
list_of_frames.append(tmp)
第一个问题是这个pythonic?感觉很丑
我真的很想把它写成一个列表理解。例如像这样:
[data.loc_set_copy([0, 'A'], i) for i in range(3)]
由于我目前正在使用 pd.DataFrame 之上的类开发自己的模块,因此我考虑在自己的类中实现此方法。我的类是围绕 pd.DataFrame 组成的,并且不继承自 pd.DataFrame。它为许多 DataFrame 方法提供了包装器,尤其是loc
它们iloc
的行为方式与您从pd.DataFrames
. 现在我有两个解决方案:
普通法
def loc_set_copy(self, key, value):
new = self.copy()
new.loc[key[0], key[1]] = value
return new
这允许:
[instance_of_my_class.loc_set_copy([0, 'A'], i) for i in range(3)]
问题是不支持切片。因此,如果我想更改整个列:
[instance_of_my_class.loc_set_copy([:, 'A'], i) for i in range(3)]
我得到一个SyntaxError
.
疯狂的解决方法
我定义了以下帮助类:
class _Loc_Set_Copy():
def __init__(self, molecule):
self.data = data
def __getitem__(self, key):
new = self.data.copy()
new.loc[key[0], key[1]] = key[2]
return new
在我的班级定义中,我有:
class my_class():
def __init__(self):
self.loc_set_copy = _Loc_Set_Copy(self)
现在我可以使用:
[instance_of_my_class.loc_set_copy[:, 'A', i] for i in range(3)]
我知道这是对语法的滥用。有什么可能的方法来干净地做到这一点,还是我应该在一开始就依赖 for 循环?