Панда итерации по строкам, как dict - PullRequest
0 голосов
/ 14 ноября 2018

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 и пандами 0.14.1.

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Определение отдельной функции для этого будет неэффективным, так как вы применяете построчные вычисления. Более эффективным будет вычисление новой серии, а затем итерация серии:

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
0 голосов
/ 14 ноября 2018

Вы можете попробовать:

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

Здесь k является индексом кадра данных, а row является диктом, поэтому вы можете получить доступ к любому столбцу с помощью: row["my_column_name"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...