python - 如何正确地将每一大块数据保存为 Pandas 数据框并将它们相互连接

标签 python python-3.x pandas bigdata large-data

我有一个包含超过 40 万行和数百列的数据框,我决定将其分块读入,因为它不适合内存并给我 MemoryError。

我设法像这样分块阅读它:

x = pd.read_csv('Training.csv', chunksize=10000)

然后我可以通过这样做获得每个 block :

a = x.get_chunk()
b = x.get_chunk()

等等 等等 继续这样做超过 40 次,这显然是缓慢且糟糕的编程习惯。

当我尝试执行以下操作以尝试创建一个可以将每个 block 保存到数据框中并以某种方式连接它们的循环时:

for x in pd.read_csv('Training.csv', chunksize=500):
    x.get_chunk()

我得到:

AttributeError: 'DataFrame' object has no attribute 'get_chunk'

在导入过程中读取文件并连接所有 block 的最简单方法是什么?

此外,我如何进一步操作我的数据集以避免内存错误问题(特别是输入空值、标准化/规范化数据帧,然后使用 scikit learn 在其上运行机器学习模型?

最佳答案

当您在对 pandas.read_csv 的调用中指定 chunksize 时,您会得到一个 pandas.io.parsers.TextFileReader 对象而不是一个 DataFrame。试试这个来遍历 block :

reader = pd.read_csv('Training.csv',chunksize=500)
for chunk in reader:
    print(type(chunk)) # chunk is a dataframe

或者抓取所有 block (这可能无法解决您的问题!):

reader = pd.read_csv('Training.csv',chunksize=500)
chunks = [chunk for chunk in reader] # list of DataFrames

根据数据集中的内容,减少内存使用的一种好方法是识别可以转换为分类数据的列。不同值的数量远低于行数的任何列都是此列的候选者。假设一列包含某种具有有限值的状态(例如“打开”、“关闭”、“暂停”),请执行以下操作:

chunk['Status'] = chunk.assign(Status=lambda x: pd.Categorical(x['Status']))

这将只为每一行存储一个整数,DataFrame 将保存一个映射(例如 0 = 'Open'、1 = 'Closed 等)

您还应该查看是否有任何数据列是多余的(它们实际上包含相同的信息)- 如果有则删除它们。我见过包含日期的电子表格,人们在其中生成了年、周、日的列,因为他们发现使用起来更容易。摆脱他们!

关于python - 如何正确地将每一大块数据保存为 Pandas 数据框并将它们相互连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656554/

相关文章:

python - Numpy:查找两个不同数组中值的索引条件(来自 R)

python-3.x - 使用 PCA 降维,同时保留百分比方差

python - Pandas DataFrame 在列中每次出现后计算每个元素的出现次数

While 循环中的 Python 随机数

python - 创建 Spark DataFrame。无法推断类型的架构

Python Shebang 线

python-3.x - Python 中带有类型提示的 2 个类的相互依赖

python - 使用 Python 将字符串列合并到一组列表

Python:如果 B 列中的另一个值重复,如何更改 A 列中的值?

python - <Array<float> 类型的 Swig 对象 *