大熊猫在字典上的行迭代

时间:2018-11-14 09:50:26

标签: python pandas performance

Helllo,

我需要遍历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,但是我丢失了一些东西,或者这意味着我必须将每个元组/ np.array转换为pd.Series或dict,也要慢。 我的约束是该脚本必须与python 2.7和pandas 0.14.1一起使用。

预先感谢您的帮助!

3 个答案:

答案 0 :(得分:15)

这是一个干净的选择:

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

答案 1 :(得分:2)

您可以尝试:

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

这里k是数据帧索引,而row是字典,因此您可以通过以下方式访问任何列:row["my_column_name"]

答案 2 :(得分:1)

为此定义单独的函数效率不高,因为您正在应用逐行计算。效率更高的方法是计算一个新序列,然后迭代该序列:

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