我有一个pandas DataFrame,包含15000条记录和20列,从Excel文件中读取。使用以下代码,将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')
我使用iloc
上的for
循环遍历DataFrame,并构建一个字典,其中列名作为字典的键,但名称不同。例如:
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)
for循环大约需要72秒。
在DataFrame上循环并构建字典的更快方法是什么?for循环不对任何列进行任何处理,除了更改dictionary的键值和使用if条件读取日期时间列。
为什么for循环需要72秒,而pandas库只需要4秒就可以读取相同数量的记录?
编辑1:
所需的输出或转换是字典对象列表。每个字典对象都有一个键:一行的所有列的值对。列表将具有与行数一样多的字典对象。
编辑2:
如果Excel是这样的:
Col 1 Col B Col C
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
我需要这样的输出:
[
{'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'
}
]
请注意,每个字典对象都有列键,但名称与Excel中的列名不同。
这是一个坏的代码,我从以前的编码器继承。我的工作是在数据框架有几千行时提高速度。我不想在这一点上改变Web应用程序的前端和后端之间的契约,因为这将需要大量的更改。
6条答案
按热度按时间h43kikqp1#
尝试
df.to_dict('records')
:输出:
dgsult0t2#
试试这个:
p1iqtdky3#
基于所提供的示例,也许您可以尝试使用列表解析。类似于:
gudnpqoy4#
我比较了Himanshu Panwar's solution的一个稍微修改的版本(为了符合OP的问题),使用列表理解(基于Anastasiya-Romanova's solution)和Corralien's solution:
输出:
vvppvyoh5#
在Python中使用普通的for循环来处理大数据从来都不是一个好主意。for循环有很多开销,使处理速度降低了几个数量级。
要将DataFrame转换为dict,请使用内置的pandas函数to_dict(),这将花费几毫秒的时间。
预先在DataFrame中执行任何其他转换(如日期时间处理)。转换为dict应该是最后一步。
如果你想以你在编辑后的帖子中所说的方式转换数据,你可以这样做:
这是非常混乱的,因为dicts不是为这样的数据操作而设计的,但它可以工作。
3vpjnl9f6#
尝试: