【问题标题】:Pandas Concat is running into Memory ErrorPandas Concat 遇到内存错误
【发布时间】:2019-04-18 16:10:23
【问题描述】:

我正在尝试预处理数据以进行进一步分析。首先,我从 csv 文件 ( x ) 中读取数据。

然后我将它分成三个部分。最后,我需要使用get_dummiesconcatsum 转换一个数组以获得groupby 的结果。

import pandas as pd

RawData_v2_clear=pd.read_csv('C:\\Users\\User\\Documents\\top200users_filtered.csv', 
        sep=';', usecols = ['Username', 'Code', 'Object'], error_bad_lines=False, 
        encoding='latin-1')

dfU = RawData_v2_clear['Username']              
dfT = RawData_v2_clear['Code']   
dfO = RawData_v2_clear['Object'] 

del RawData_v2_clear, dfO                               (to free up some memory)

df_newT = pd.concat([dfU,pd.get_dummies(dfT)],axis=1)

df_new_gbyT = df_newT.groupby('Username').sum()

Raw_Data_V2_clear 具有形状(约 1100 万行 x 3 列)。

Error:
  File "c:\Users\User\Desktop\Faulty_Skript.py", line XXX, in <module>
    df_newT = pd.concat([dfU,pd.get_dummies(dfT)],axis=1).sum()
  File "C:\Users\User\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\reshape.py", line 866, in get_dummies
    dtype=dtype)
  File "C:\Users\User\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\reshape.py", line 963, in _get_dummies_1d
    dummy_mat = np.eye(number_of_cols, dtype=dtype).take(codes, axis=0)
MemoryError

在另一个系统上,此操作需要一些时间,但在没有Memory Error 的情况下完成。也许有人有一个好主意来解决这个内存问题?也许 append 比 concat 对内存更友好?但是,我在当前系统上的 append 实现也失败了。

非常感谢!

【问题讨论】:

  • 更通用的解决方案是使用 Dask。我在处理大型数据集时经常遇到这个问题。如果您使用的是 ipython/jupyter notebook,也许可以尝试重置内核以释放内存。也可以尝试分块读取 csv,然后再将它们连接起来?
  • 也许尝试将“用户名”列转换为category dtype..?可以尝试将dtype={'Username': 'category'} 传递给 read_csv 方法...?
  • @YashNag 是的,我通过 Conda 尝试了 Spyder 和 VS Code。然而,两者都遇到了同样的问题。以后很难将它们连接起来,因为这是我将分析的最终数据。令人困惑的是,这在另一个功能较弱的系统上运行得很好。克里斯:我有 3000 个不同的用户名,所以将其用作类别可能没有太大帮助,对吧?
  • 类别类型是超级内存效率。如果它现在是“对象”类型,则转换为类别将释放大量空间......在引擎盖下编码为“int”。如果您有超过 1100 万行只有 3000 个唯一用户名,那么无论如何都值得一试...pandas.pydata.org/pandas-docs/stable/user_guide/…
  • @Mike_H 很抱歉听到那个哥们。看起来您最终试图创建“用户名”和“代码”的交叉表......?尝试使用dtype='category' 阅读,然后直接转到df_new_gbyT = pd.crosstab(RawData_v2_clear.Username, RawData_v2_clear.Code) ..?

标签: python pandas dataframe


【解决方案1】:

IIUC,在read_csv 方法中尝试dtype='category' 参数和pandas.crosstab 代替:

import pandas as pd

RawData_v2_clear=pd.read_csv('C:\\Users\\User\\Documents\\top200users_filtered.csv', 
        sep=';', usecols = ['Username', 'Code', 'Object'], error_bad_lines=False, 
        encoding='latin-1', dtype='category')

df_new_gbyT = pd.crosstab(RawData_v2_clear.Username, RawData_v2_clear.Code)

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多