迭代 Pandas DataFrame 的行作为字典

新手上路,请多包涵

我需要遍历 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])

关于如何提高性能的任何建议?我尝试使用 tried df.iterrows() 进行迭代,但出现以下错误:

TypeError: ** 之后的 myfunc() 参数必须是一个映射,而不是元组

我也尝试过 df.itertuples()df.values ,但要么我遗漏了一些东西,要么意味着我必须将每个元组/ np.array 转换为 pd.Series 或 dict ,这也会很慢。我的约束是脚本必须与 python 2.7 和 pandas 0.14.1 一起使用。

原文由 Matina G 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 693
2 个回答

你可以试试:

 for k, row in df.iterrows():
    myfunc(**row)

这里 k 是数据帧索引 row 是一个字典,所以你可以访问任何列: row["my_column_name"]

原文由 stellasia 发布,翻译遵循 CC BY-SA 4.0 许可协议

一个干净的选择是这个:

 for row_dict in df.to_dict(orient="records"):
    print(row_dict['column_name'])

原文由 avloss 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题