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

Python 如何减少数据帧的内存?

Python 如何减少数据帧的内存?,python,pandas,Python,Pandas,我在日常工作中使用熊猫,我使用的一些数据帧非常大(以数亿行乘以数百列的顺序)。有没有办法减少RAM内存消耗?您可以使用此功能。它通过将数据类型钳制到每列所需的最小值来减少数据的大小 代码不是我的,我从下面的链接复制了它,并根据我的需要进行了修改。 def reduce_mem_用法(df,int_cast=True,obj_to_category=False,subset=None): """ 遍历dataframe的所有列并修改数据类型以减少内存使用。 :param df:dataframe

我在日常工作中使用熊猫,我使用的一些数据帧非常大(以数亿行乘以数百列的顺序)。有没有办法减少RAM内存消耗?

您可以使用此功能。它通过将数据类型钳制到每列所需的最小值来减少数据的大小

代码不是我的,我从下面的链接复制了它,并根据我的需要进行了修改。

def reduce_mem_用法(df,int_cast=True,obj_to_category=False,subset=None):
"""
遍历dataframe的所有列并修改数据类型以减少内存使用。
:param df:dataframe to reduce(局部数据帧)
:param int_cast:指示是否应尝试将列强制转换为int(bool)
:param obj_to_category:将与日期时间无关的对象转换为类别数据类型(bool)
:param subset:要分析的列的子集(列表)
:return:调整了列数据类型的数据集(pd.DataFrame)
"""
start_mem=df.memory_usage().sum()/1024**2;
gc.collect()
print('dataframe的内存使用量为{.2f}MB'。格式(start_mem))
cols=子集,如果子集不是None-else df.columns.tolist()
对于tqdm中的col(cols):
col_type=df[col].dtype
如果col_类型!=对象和列类型.name!='“类别”和“日期时间”不在col_type.name中:
c_min=df[col].min()
c_max=df[col].max()
#测试列是否可以转换为整数
将_视为_int=str(col_type)[:3]=='int'
如果int_强制转换而不将_视为_int:
视_为_int=检查_是否为整数(df[col])
如果将_视为_int:
如果c_min>np.iinfo(np.int8).min和c_maxnp.iinfo(np.uint8).min和c_maxnp.iinfo(np.int16).min和c_maxnp.iinfo(np.uint16).min和c_maxnp.iinfo(np.int32).min和c_maxnp.iinfo(np.uint32).min和c_maxnp.iinfo(np.int64).min和c_maxnp.iinfo(np.uint64).min和c_maxnp.finfo(np.float16).min和c_maxnp.finfo(np.float32).min和c_max
如果数据不适合内存,请考虑使用。它有一些很好的特性,比如延迟计算和并行性,这些特性允许您将数据保存在磁盘上,并仅在需要结果时以分块的方式提取数据。它还有一个类似熊猫的界面,因此您可以保留大部分当前代码

一般来说,它工作得好吗?我两年前就试过了,感觉很糟糕,对我来说效果很好。但是我在这里经常遵循“减少,然后使用熊猫”的建议,因此对于分析中更复杂的部分,我可能会默认为熊猫本身。这段代码缺少导入(gc、tqdm)和“check_if_integer”的定义,可能更多。
def reduce_mem_usage(df, int_cast=True, obj_to_category=False, subset=None):
    """
    Iterate through all the columns of a dataframe and modify the data type to reduce memory usage.
    :param df: dataframe to reduce (pd.DataFrame)
    :param int_cast: indicate if columns should be tried to be casted to int (bool)
    :param obj_to_category: convert non-datetime related objects to category dtype (bool)
    :param subset: subset of columns to analyse (list)
    :return: dataset with the column dtypes adjusted (pd.DataFrame)
    """
    start_mem = df.memory_usage().sum() / 1024 ** 2;
    gc.collect()
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))

    cols = subset if subset is not None else df.columns.tolist()

    for col in tqdm(cols):
        col_type = df[col].dtype

        if col_type != object and col_type.name != 'category' and 'datetime' not in col_type.name:
            c_min = df[col].min()
            c_max = df[col].max()

            # test if column can be converted to an integer
            treat_as_int = str(col_type)[:3] == 'int'
            if int_cast and not treat_as_int:
                treat_as_int = check_if_integer(df[col])

            if treat_as_int:
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.uint8).min and c_max < np.iinfo(np.uint8).max:
                    df[col] = df[col].astype(np.uint8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.uint16).min and c_max < np.iinfo(np.uint16).max:
                    df[col] = df[col].astype(np.uint16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.uint32).min and c_max < np.iinfo(np.uint32).max:
                    df[col] = df[col].astype(np.uint32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
                elif c_min > np.iinfo(np.uint64).min and c_max < np.iinfo(np.uint64).max:
                    df[col] = df[col].astype(np.uint64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        elif 'datetime' not in col_type.name and obj_to_category:
            df[col] = df[col].astype('category')
    gc.collect()
    end_mem = df.memory_usage().sum() / 1024 ** 2
    print('Memory usage after optimization is: {:.3f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))

    return df