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 应用程序的前端和后端之间的合同,因为这将需要进行大量更改。
尝试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)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |