【发布时间】:2019-04-17 05:53:59
【问题描述】:
我需要遍历 pandas 数据帧,以便将每一行作为函数(实际上是类构造函数)的参数传递给 **kwargs。这意味着每一行都应该表现为一个字典,键是列名,值是每行对应的值。
这行得通,但效果很差:
import pandas as pd
def myfunc(**kwargs):
try:
area = kwargs.get('length', 0)* kwargs.get('width', 0)
return area
except TypeError:
return 'Error : length and width should be int or float'
df = pd.DataFrame({'length':[1,2,3], 'width':[10, 20, 30]})
for i in range(len(df)):
print myfunc(**df.iloc[i])
关于如何提高性能的任何建议?我试过用试过的df.iterrows()进行迭代,
但我收到以下错误:
TypeError: ** 后的 myfunc() 参数必须是映射,而不是元组
我也尝试过 df.itertuples() 和 df.values ,但要么我遗漏了一些东西,要么这意味着我必须将每个 tuple / np.array 转换为 pd.Series 或 dict ,这也会很慢。
我的限制是脚本必须与 python 2.7 和 pandas 0.14.1 一起使用。
【问题讨论】:
-
代码中最慢的部分是区域的打印。如果我在具有 10.000 行的 python 3 中尝试它,我需要 1.5 秒的变体(不打印),使用 itterrows() 需要 0.9 秒,如果我打印区域则需要超过 3 秒
-
感谢您的建议。我已经尝试过了,但我似乎不知道如何访问行的每个元素的列名。至于打印,我只是为了代码的可执行性而写的,重要的是迭代性能
标签: python pandas performance