Pandas的数据帧(Python)是否更靠近R的数据帧或数据表?

时间:2017-12-14 17:28:19

标签: python r pandas dataframe data.table

为了理解我的问题,我首先应该指出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')

1 个答案:

答案 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

你可以看到几件事:

  1. 创建y时,它只是原始数组周围的光包装:即没有数据被复制。

  2. y中的列重命名时,会导致内存中整个数据数组的重复(它与{{}时的38 MB增量相同1}}首先创建)。

  3. 因此,除非我遗漏了某些东西,否则看起来Pandas的操作更像是R的数据框而不是R的数据表。

    编辑:请注意x有一个控制此行为的参数rename(),默认为True。例如,使用:

    copy

    ...导致无需复制数据的就地操作。

    或者,您可以直接修改y.rename(columns = {'e': 'f'}, inplace=True, copy=False) 属性:

    columns