我将通过使用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)
我真的很想把它写成一个列表理解。例如:
[data.loc_set_copy([0, 'A'], i) for i in range(3)]
由于我目前正在pd.DataFrame之上开发自己的模块,所以我考虑在自己的类中实现这个方法。我的类是围绕pd.DataFrame组成的,没有从pd.DataFrame继承。
它为许多DataFrame方法提供了 Package 器,特别是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)]
我得到一个语法错误。
疯狂解决方案
我定义了下面的helper类:
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循环?
1条答案
按热度按时间e4eetjau1#
当然你可以传递一个
slice
,使用一个slice
对象:更漂亮的是:
注意事项:
从本质上讲,切片表示法是将
slice
对象传递给__getitem__
的语法糖:注意,鉴于上述情况,您可以将方法简化为:
如果您小心地为
key
参数传递tuple
s:以下内容现在应该是完全有意义的: