循环遍历具有 15000 条记录的 pandas 数据帧非常慢,需要 72 秒

All*_*ons 1 python dataframe pandas

我有一个 pandas DataFrame,包含从 Excel 文件读取的 15000 条记录和 20 列。使用此代码将 Excel 文件读入 DataFrame 大约需要 4.13 秒。我系统上的pandas版本是2.0.2。

df = pd.read_excel(excel_path, sheet_name='Sheet 1', header=[
                         2, 3]).astype(object).replace(np.nan, 'None')
Run Code Online (Sandbox Code Playgroud)

for我使用循环遍历 DataFrameiloc并构建一个字典,其中列名称作为字典的键,但名称不同。例如:

data = []
for i in df.iloc:
    mydict = {}
    mydict['col1'] = i['Column 1 Name'].values[0]
    mydict['col2'] = i['Column 2 Name'].values[0]

    mydict['doc_date'] = datetime.datetime.strftime(i['Doc Details']['Doc Date'], r'%d-%m-%Y') \
        if isinstance(i['Doc Details']['Doc Date'], datetime.datetime) \
        else i['Doc Details']['Doc Date'].replace('/', '-')


    # 17 more columns

    data.append(mydict)
Run Code Online (Sandbox Code Playgroud)

for 循环大约需要 72 秒。

循环 DataFrame 和构建字典的更快方法是什么?除了更改字典的键名称和使用 if 条件读取日期时间列之外,for 循环不对任何列进行任何处理。

为什么pandas库只需要4秒就可以读取相同数量的记录,而for循环却需要72秒呢?

编辑1:

所需的输出或转换是字典对象的列表。每个字典对象都将具有一行所有列的键:值对。该列表将包含与行数一样多的字典对象。

编辑2:

如果我的Excel是这样的:

Col 1   Col B   Col C
0       0       0
1       1       1
2       2       2
3       3       3
4       4       4
Run Code Online (Sandbox Code Playgroud)

我需要这样的输出:

[
    {'mycol1': '0', 'mycol2': '0', 'mycol3': '0'
    },
    {'mycol1': '1', 'mycol2': '1', 'mycol3': '1'
    },
    {'mycol1': '2', 'mycol2': '2', 'mycol3': '2'
    },
    {'mycol1': '3', 'mycol2': '3', 'mycol3': '3'
    },
    {'mycol1': '4', 'mycol2': '4', 'mycol3': '4'
    }
]
Run Code Online (Sandbox Code Playgroud)

请注意,每个字典对象都有列键,但名称与 Excel 中的列名称不同。

这是我从以前的编码器继承的糟糕代码。我的工作是当数据帧有几千行时提高速度。我现在不想更改 Web 应用程序的前端和后端之间的合同,因为这将需要进行大量更改。

Cor*_*ien 6

尝试df.to_dict('records')

dmap = {'A': 'mycol1', 'B': 'mycol2', 'C': 'mycol3'}
out = df.rename(columns=dmap).to_dict('records')
Run Code Online (Sandbox Code Playgroud)

输出:

>>> out
[{'mycol1': 0, 'mycol2': 0, 'mycol3': 0},
 {'mycol1': 1, 'mycol2': 1, 'mycol3': 1},
 {'mycol1': 2, 'mycol2': 2, 'mycol3': 2},
 {'mycol1': 3, 'mycol2': 3, 'mycol3': 3},
 {'mycol1': 4, 'mycol2': 4, 'mycol3': 4}]
Run Code Online (Sandbox Code Playgroud)