Pandas Concat 遇到了内存错误。

4

我正在尝试预处理数据以进行进一步分析。首先,我从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

在另一个系统上,此操作需要一些时间,但在没有内存错误的情况下完成。也许有人有好的想法来解决这个内存问题?也许appendconcat更加友好?然而,在我的当前系统上,我的append实现也失败了。

非常感谢!


一个更通用的解决方案是使用Dask。在处理大型数据集时,我经常遇到这个问题。如果您正在使用ipython/jupyter笔记本电脑,可以尝试重置内核以释放内存。另外,也许可以尝试分块读取csv文件,然后稍后再将它们连接起来? - Yash Nag
也许尝试将“用户名”列转换为 category 数据类型..? 可以尝试在 read_csv 方法中传递 dtype={'Username': 'category'}...? - Chris Adams
@YashNag 是的,我尝试了通过Conda使用Spyder和VS Code。但是两者都遇到了同样的问题。很难之后将它们连接起来,因为这是我最终要分析的数据。令人困惑的是,在另一个性能较低的系统上,这个程序运行得非常好。Chris: 我有3000个不同的用户名,所以将其用作类别可能帮助不大,对吧? - Mike_H
类别类型非常节省内存。如果它的类型是“对象”,那么将其转换为类别类型将释放大量空间...在底层编码为“int”。如果您有超过1100万行,但只有3000个唯一用户名,那么尝试一下也是值得的...https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html#categorical-memory - Chris Adams
1
@Mike_H 很抱歉听到这个消息。看起来你最终想要创建“用户名”和“代码”的交叉表,是吗?尝试使用 dtype='category' 读入数据,然后直接使用 df_new_gbyT = pd.crosstab(RawData_v2_clear.Username, RawData_v2_clear.Code) ..? - Chris Adams
显示剩余2条评论
1个回答

2
根据我的理解,尝试在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接