将 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

如何将 Python 字典附加到 Pandas DataFrame,将键与列名匹配

003.pandas.DataFrame

003.pandas.DataFrame

Pandas-DataFrame基础知识点总结

带有嵌套字典的 Pandas DataFrame