我有一个大的数据集,我必须转换成.csv格式,由29列和1M+行组成.我认为,随着数据帧变得越来越大,向其添加任何行都会越来越耗时.我想知道是否有更快的方法,分享代码中的相关片段.

不过,任何建议都是受欢迎的.


df = DataFrame()

for startID in range(0, 100000, 1000):
    s1 = time.time()
    tempdf = DataFrame()
    url = f'https://******/products?startId={startID}&size=1000'

    r = requests.get(url, headers={'****-Token': 'xxxxxx', 'Merchant-Id': '****'})
    jsonList = r.json()  # datatype= list, contains= dict

    normalized = json_normalize(jsonList)
    # type(normal) = pandas.DataFrame
    print(startID / 1000) # status indicator
    for series in normalized.iterrows():  
        series = series[1] # iterrows returns tuple (index, series)
        offers = series['offers']
        series = series.drop(columns='offers')
        length = len(offers)

        for offer in offers:
            n = json_normalize(offer).squeeze()  # squeeze() casts DataFrame into Series
            concatinated = concat([series, n]).to_frame().transpose()
            tempdf = tempdf.append(concatinated, ignore_index=True)

    del normalized
    df = df.append(tempdf)
    f1 = time.time()
    print(f1 - s1, ' seconds')

df.to_csv('out.csv')

推荐答案

正如莫希特·莫特瓦尼所建议的,最快的方法是将数据收集到字典中,然后将所有数据加载到数据帧中.以下是一些速度测量示例:

import pandas as pd
import numpy as np
import time
import random

end_value = 10000

用于创建字典列表并在最后将所有字典加载到数据帧中的度量

start_time = time.time()
dictinary_list = []
for i in range(0, end_value, 1):
    dictionary_data = {k: random.random() for k in range(30)}
    dictionary_list.append(dictionary_data)

df_final = pd.DataFrame.from_dict(dictionary_list)

end_time = time.time()
print('Execution time = %.6f seconds' % (end_time-start_time))

执行时间=0.090153秒

将数据添加到列表和concat到数据框中的测量:

start_time = time.time()
appended_data = []
for i in range(0, end_value, 1):
    data = pd.DataFrame(np.random.randint(0, 100, size=(1, 30)), columns=list('A'*30))
    appended_data.append(data)

appended_data = pd.concat(appended_data, axis=0)

end_time = time.time()
print('Execution time = %.6f seconds' % (end_time-start_time))

执行时间=4.183921秒

附加数据帧的测量:

start_time = time.time()
df_final = pd.DataFrame()
for i in range(0, end_value, 1):
    df = pd.DataFrame(np.random.randint(0, 100, size=(1, 30)), columns=list('A'*30))
    df_final = df_final.append(df)

end_time = time.time()
print('Execution time = %.6f seconds' % (end_time-start_time))

执行时间=11.085888秒

按loc使用插入数据的测量:

start_time = time.time()
df = pd.DataFrame(columns=list('A'*30))
for i in range(0, end_value, 1):
    df.loc[i] = list(np.random.randint(0, 100, size=30))


end_time = time.time()
print('Execution time = %.6f seconds' % (end_time-start_time))

执行时间=21.029176秒

Python-3.x相关问答推荐

查找值始终为零的行 pandas

PyQt5 中耦合滑块和拨号小部件.解决结果不一致的问题

Python 舍入数字不准确

为什么不能用格式字符串 '-' 绘制点?

如何将 WebDriver 传输到导入的测试?

单击图形时 plotly graph_objects 持久性数据

如果网站加载时间过长,如何强制 Selenium 刷新

如何准确测定cv2的结果.在BW/黑白图像中查找对象?

Await Future 来自 Executor:Future 不能在await表达式中使用

pandas 中 df.reindex() 和 df.set_index() 方法的区别

Python heapify() 时间复杂度

通过多个键对字典列表进行分组和聚合

Python中的多行日志(log)记录

从大字典中弹出 N 项的最快方法

Python在OrderedDict中 Select 第i个元素

如何在 jupyter notebook 5 中逐行分析 python 3.5 代码

如何等待 create_task() 创建的任务完成?

Python 3 中的连接列表

从 csv 中删除单行而不复制文件

Python:如何在 Windows 资源管理器中打开文件夹(Python 3.6.2、Windows 10)