Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列出几个框架_Python_Pandas_Mutable_Sanity Check - Fatal编程技术网

Python 列出几个框架

Python 列出几个框架,python,pandas,mutable,sanity-check,Python,Pandas,Mutable,Sanity Check,我将使用pd.DataFrames来问这个问题,因为使用它们时会出现问题。但在python中,它可能被推广到可变表 我想创建一个数据帧列表,其中一个值不同。 目前我确实: 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.

我将使用pd.DataFrames来问这个问题,因为使用它们时会出现问题。但在python中,它可能被推广到可变表

我想创建一个数据帧列表,其中一个值不同。 目前我确实:

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的。 它为许多数据帧方法提供包装,尤其是
loc
iloc
的包装,它们的行为方式与您从
pd.DataFrames
中了解到的方式相同。 现在我有两个解决方案:

常规方法 这允许:

[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循环?

确保可以传递
切片
,使用
切片
对象:

>>> [loc_set_copy(data, [slice(None), 'A'], i) for i in range(3)]
[   A    B
0  0  0.0
1  0  0.0,    A    B
0  1  0.0
1  1  0.0,    A    B
0  2  0.0
1  2  0.0]
更漂亮的是:

>>> from pprint import pprint
>>> pprint([loc_set_copy(data, [slice(None), 'A'], i) for i in range(3)])
[   A    B
0  0  0.0
1  0  0.0,
    A    B
0  1  0.0
1  1  0.0,
    A    B
0  2  0.0
1  2  0.0]
>>>
注:

从本质上讲,切片表示法是将
slice
对象传递到
\uu getitem\uu

>>> x = list(range(22))
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
>>> x[0:10:2]
[0, 2, 4, 6, 8]
>>> x[slice(0,10,2)]
[0, 2, 4, 6, 8]
>>> x.__getitem__(slice(0,10,2))
[0, 2, 4, 6, 8]
>>>
注意,鉴于上述情况,您可以将方法简化为:

>>> def loc_set_copy(self, key, value):
...     new = self.copy()
...     new.loc[key] = value
...     return new
...
如果小心地为
参数传递
元组
s:

>>> pprint([loc_set_copy(data, (0, 'A'), i) for i in range(3)])
[     A    B
0  0.0  0.0
1  0.0  0.0,
      A    B
0  1.0  0.0
1  0.0  0.0,
      A    B
0  2.0  0.0
1  0.0  0.0]
>>> pprint([loc_set_copy(data, (slice(None), 'A'), i) for i in range(3)])
[   A    B
0  0  0.0
1  0  0.0,
    A    B
0  1  0.0
1  1  0.0,
    A    B
0  2  0.0
1  2  0.0]
>>>
以下几点现在应该很有意义:

>>> class A:
...   def __getitem__(self, key):
...     print(type(key))
...     print(key)
...
>>> a = A()
>>> a[1]
<class 'int'>
1
>>> a[[1]]
<class 'list'>
[1]
>>> a[object()]
<class 'object'>
<object object at 0x1003932e0>
>>>
>>> a[:1]
<class 'slice'>
slice(None, 1, None)
>>> a[:]
<class 'slice'>
slice(None, None, None)
>>> a[:,:,1:4]
<class 'tuple'>
(slice(None, None, None), slice(None, None, None), slice(1, 4, None))
>>> a[:,:,[1,2]]
<class 'tuple'>
(slice(None, None, None), slice(None, None, None), [1, 2])
>>> a[:,object():,[1,2]]
<class 'tuple'>
(slice(None, None, None), slice(<object object at 0x1003932e0>, None, None), [1, 2])
>>>
>>A类:
...   def _u获取项目(自身,密钥):
...     打印(键入(键))
...     打印(键)
...
>>>a=a()
>>>a[1]
1.
>>>a[[1]]
[1]
>>>[object()]
>>>
>>>a[:1]
切片(无,1,无)
>>>a[:]
切片(无、无、无)
>>>a[:,:,1:4]
(切片(无,无,无),切片(无,无,无),切片(1,4,无))
>>>a[:,:,[1,2]]
(切片(无,无,无),切片(无,无),[1,2])
>>>a[:,object():,[1,2]]
(切片(无,无,无),切片(,无,无),[1,2])
>>>

非常感谢您的详细回答。虽然内容不是我想听到的,因为我更喜欢冒号符号
>>> pprint([loc_set_copy(data, (0, 'A'), i) for i in range(3)])
[     A    B
0  0.0  0.0
1  0.0  0.0,
      A    B
0  1.0  0.0
1  0.0  0.0,
      A    B
0  2.0  0.0
1  0.0  0.0]
>>> pprint([loc_set_copy(data, (slice(None), 'A'), i) for i in range(3)])
[   A    B
0  0  0.0
1  0  0.0,
    A    B
0  1  0.0
1  1  0.0,
    A    B
0  2  0.0
1  2  0.0]
>>>
>>> class A:
...   def __getitem__(self, key):
...     print(type(key))
...     print(key)
...
>>> a = A()
>>> a[1]
<class 'int'>
1
>>> a[[1]]
<class 'list'>
[1]
>>> a[object()]
<class 'object'>
<object object at 0x1003932e0>
>>>
>>> a[:1]
<class 'slice'>
slice(None, 1, None)
>>> a[:]
<class 'slice'>
slice(None, None, None)
>>> a[:,:,1:4]
<class 'tuple'>
(slice(None, None, None), slice(None, None, None), slice(1, 4, None))
>>> a[:,:,[1,2]]
<class 'tuple'>
(slice(None, None, None), slice(None, None, None), [1, 2])
>>> a[:,object():,[1,2]]
<class 'tuple'>
(slice(None, None, None), slice(<object object at 0x1003932e0>, None, None), [1, 2])
>>>