为了理解我的问题,我首先应该指出R数据表不仅仅是具有语法糖的R数据帧,还有重要的行为差异:在数据表中通过引用进行列分配/修改可以避免在内存中复制整个对象(请参阅this quora answer中的示例,因为在数据框中就是这种情况。
我多次发现data.table
行为引起的速度和内存差异是一个关键因素,它允许一个人使用大型数据集,而data.frame
则不可能1}}的行为。
因此,我想知道的是:在Python中,Pandas
'数据帧在这方面的表现如何?
奖金问题:如果Pandas的数据帧更接近R数据帧而不是R数据表,并且具有相同的下行(分配/修改列时对象的完整副本),是否有等效于R的{{1包裹?
每条评论请求的编辑:代码示例:
R数据帧:
data.table
R datatables:
# renaming a column
colnames(mydataframe)[1] <- "new_column_name"
在熊猫:
# renaming a column
library(data.table)
setnames(mydatatable, 'old_column_name', 'new_column_name')
答案 0 :(得分:12)
在这方面,熊猫更像data.frame
。您可以使用memory_profiler包进行检查;这是在Jupyter笔记本中使用它的一个例子:
首先定义一个测试它的程序:
%%file df_memprofile.py
import numpy as np
import pandas as pd
def foo():
x = np.random.rand(1000000, 5)
y = pd.DataFrame(x, columns=list('abcde'))
y.rename(columns = {'e': 'f'}, inplace=True)
return y
然后加载内存探查器并运行+ profile the function
%load_ext memory_profiler
from df_memprofile import foo
%mprun -f foo foo()
我得到以下输出:
Filename: /Users/jakevdp/df_memprofile.py
Line # Mem usage Increment Line Contents
================================================
4 66.1 MiB 66.1 MiB def foo():
5 104.2 MiB 38.2 MiB x = np.random.rand(1000000, 5)
6 104.4 MiB 0.2 MiB y = pd.DataFrame(x, columns=list('abcde'))
7 142.6 MiB 38.2 MiB y.rename(columns = {'e': 'f'}, inplace=True)
8 142.6 MiB 0.0 MiB return y
你可以看到几件事:
创建y
时,它只是原始数组周围的光包装:即没有数据被复制。
当y
中的列重命名时,会导致内存中整个数据数组的重复(它与{{}时的38 MB增量相同1}}首先创建)。
因此,除非我遗漏了某些东西,否则看起来Pandas的操作更像是R的数据框而不是R的数据表。
编辑:请注意x
有一个控制此行为的参数rename()
,默认为True。例如,使用:
copy
...导致无需复制数据的就地操作。
或者,您可以直接修改y.rename(columns = {'e': 'f'}, inplace=True, copy=False)
属性:
columns