将 Pandas DataFrame 的行作为字典进行迭代
Posted
技术标签:
【中文标题】将 Pandas DataFrame 的行作为字典进行迭代【英文标题】:Iteration over the rows of a Pandas DataFrame as dictionaries 【发布时间】: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 一起使用。
【问题讨论】:
试试DataFrame.iterrows 代码中最慢的部分是区域的打印。如果我在具有 10.000 行的 python 3 中尝试它,我需要 1.5 秒的变体(不打印),使用 itterrows() 需要 0.9 秒,如果我打印区域则需要超过 3 秒 感谢您的建议。我已经尝试过了,但我似乎不知道如何访问行的每个元素的列名。至于打印,我只是为了代码的可执行性而写的,重要的是迭代性能 【参考方案1】:一个干净的选项是这个:
for row_dict in df.to_dict(orient="records"):
print(row_dict['column_name'])
【讨论】:
这是最好的答案 根据最新文档,现在是orient='records'
: pandas.pydata.org/pandas-docs/stable/reference/api/…
或者,如果您还想要密钥,请使用“索引”而不是“记录”。然后,您还必须使用 items()
来遍历键/值
这也是迭代行的最佳方式,而不会遇到 1) 像 .iterrows()
那样强制数据类型或 2)的问题> 使用无效的 Python 标识符(如 itertuples()
does)重命名列。【参考方案2】:
为此定义一个单独的函数将是低效的,因为您正在应用逐行计算。更有效的是计算一个新系列,然后迭代系列:
df = pd.DataFrame('length':[1,2,3,'test'], 'width':[10, 20, 30,'hello'])
df2 = df.iloc[:].apply(pd.to_numeric, errors='coerce')
error_str = 'Error : length and width should be int or float'
print(*(df2['length'] * df2['width']).fillna(error_str), sep='\n')
10.0
40.0
90.0
Error : length and width should be int or float
【讨论】:
【参考方案3】:你可以试试:
for k, row in df.iterrows():
myfunc(**row)
这里k
是数据帧索引,row
是一个字典,因此您可以使用以下命令访问任何列:row["my_column_name"]
【讨论】:
该案例的良好解决方案,但请注意 iterrows 在大型数据集中会影响性能see here 这是真的,我只是为了使 iterrows 工作而回答,但就性能而言,@jpp 解决方案可能更好。以上是关于将 Pandas DataFrame 的行作为字典进行迭代的主要内容,如果未能解决你的问题,请参考以下文章
将字典值增量添加到 pandas DataFrame。具有dict键列名的DataFrame