Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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_Numpy_Pandas_Scipy - Fatal编程技术网

Python 使用熊猫的列视图?

Python 使用熊猫的列视图?,python,numpy,pandas,scipy,Python,Numpy,Pandas,Scipy,是否可以在不复制的情况下创建列中值的视图?例如: import numpy as np import pandas as pd class Aclass: pass df = pd.DataFrame(np.random.rand(8,2),columns=['a','b']) 这项工作: Aclass.a = df['a'] Aclass.a is df['a'] Out[51]: True 但不是这个: Aclass.a = df['a'].values Aclass.a

是否可以在不复制的情况下创建列中值的视图?例如:

import numpy  as np
import pandas as pd

class Aclass:
    pass

df = pd.DataFrame(np.random.rand(8,2),columns=['a','b'])
这项工作:

Aclass.a = df['a']
Aclass.a is df['a']
Out[51]: True
但不是这个:

Aclass.a = df['a'].values
Aclass.a is df['a'].values
Out[54]: False

我想这样做是为了以增量方式将pandas包含到项目中,而不会受到太多额外内存使用的影响。

实际上,在这种情况下,您并不是在复制数据,而是在创建数组“容器”

在许多情况下,
df.values
将返回一个副本(例如,不同列的不同数据类型,或者数据在内存中不连续的任何情况),但是对于一个简单的系列或具有一个数据类型的数据帧,它返回数据的视图

即使数组对象不同,它们也指向相同的数据缓冲区。只使用了几个额外的内存字节

例如:

import numpy  as np
import pandas as pd

df = pd.DataFrame(np.random.rand(8,2),columns=['a','b'])

# Every time you call `values` a new array object is created:
print df.a.values is df.a.values # This will be False

# But the data is _not_ copied:
x = df['a'].values
y = df.a.values
print np.may_share_memory(x, y) #This will be True

# And if we modify "x" or "y", we'll modify the original data frame:
x[0] = -9
y[-1] = -8
print df

# However, this only holds for cases where the data can be 
# viewed as a numpy array.

# This will modify the original dataframe:
z = df.values
z[0,:] = -5
print df

# But this won't, because the types are different and "values" returns
# a copy:
df['b'] = df['b'].astype(int)
arr = df.values
arr[0,:] = 10
print df

在第一个示例中,您正在查看序列,但在第二个示例中,您正在调用属性
values
,该属性返回值的numpy数组表示形式,因此它们不相同,查看序列有什么问题?有numpy/scipy函数,包括我的代码库中的一些内容,它假定ndarray作为输入,因此不接受series视图。我希望我可以实现pandas“under the hood”。我经历了您提到的,特别是sklearn,不幸的是,这些方法有时会出现调用数组属性不正确的问题,不幸的是,在这种情况下,您可能需要复制numpy数组。如果您担心内存问题,那么您可以在复制numpy值后调用
del df['a']
。W,太好了,谢谢!这应该包括在熊猫FAQ中。除非它已经是,我错过了它。。。