使用pandas的列视图?

2024-06-02 08:01:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

import numpy  as np
import pandas as pd

class Aclass:
    pass

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

这是有效的:

^{pr2}$

但不是这个:

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

我想这样做是为了在项目中逐步包含pandas,而不需要太多额外的内存使用。在


Tags: importnumpy视图dataframepandasdfasnp
1条回答
网友
1楼 · 发布于 2024-06-02 08:01:52

实际上,在本例中,您不需要复制数据,而只是创建数组“container”。在

在很多情况下,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

相关问题 更多 >