Панды: применение функции к строкам, запись в новые столбцы - PullRequest
0 голосов
/ 17 октября 2018

Применение функций к фрейму данных

В настоящее время у меня есть следующий фрейм данных:

Данные

url                            visitors
http://somedomain.com          200000
http://someotherdomain.com     150000
http://somenewdomain.com       11000

Для каждой строки в фрейме данных мне нравитсяприменить две функции к столбцу url, а затем записать каждый результат в два отдельных столбца 'meta' и 'content'.

Функции:

def metacrawler(url)
    ...
    return data

def contentcrawler(url)
    ...
    return data

# Counter
progress = 0

Loop

for index, row in data.iterrows():
    print(str(progress)," out of ",str(len(data)))
    print('Starting meta crawling.')
    row['meta'] = metacrawler(row["url"])
    print('Starting content crawling.')
    row['content'] = contentcrawler(row["url"])
    print('Complete.')
    progress += 1

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

Что я сделал не так?

Решение

def func(row):
    print("Crawling Meta")
    meta = metacrawler(row["url"])
    print("Crawling Content")
    tags = contentcrawler(row["url"])
    return meta, content

data[['meta', 'content']] = data.apply(func, axis=1, result_type='expand')

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете использовать функцию .apply() Документы с result_type='expand'

In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})

In [4]: df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
Out[4]:
    0   1
0   6   6
1   8   8
2  10  10
3  12  12

In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')

In [6]: df
Out[6]:
   one  two  new  etc
0    1    5    6    6
1    2    6    8    8
2    3    7   10   10
3    4    8   12   12

Редактировать: если вы хотите показать прогресс, определите применяемую функцию отдельно, т.е.

def func(row):
    print(row)
    return sum(row), sum(row)


In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})

In [4]: df.apply(func), axis=1, result_type='expand')
Out[4]:
    0   1
0   6   6
1   8   8
2  10  10
3  12  12

In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')

In [6]: df
Out[6]:
   one  two  new  etc
0    1    5    6    6
1    2    6    8    8
2    3    7   10   10
3    4    8   12   12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...