Python / Обновление строки панды с новым значением столбца из функции

Python 2.7 Я пытаюсь записать результат "проверки робота" (хотя я полагаю, что это применимо в других обстоятельствах), где я перебираю фрейм данных. я пытался

import robotparser
import urlparse
import pandas as pd
df = pd.DataFrame(dict(A=['http://www.python.org'
                          ,'http://www.junksiteIamtellingyou.com'
                         ]))

df
    A
0   http://www.python.org
1   http://www.junksiteIamtellingyou.com

agent_name = 'Test'
for i in df['A']:
    try:
        parser = robotparser.RobotFileParser()
        parser.set_url(urlparse.urljoin(i,"robots.txt"))
        parser.read()
    except Exception as e:
        df['Robot'] =  'No Robot.txt'
    else:
        df['Robot'] =  parser.can_fetch(agent_name, i)
df
    A                                       Robot
0   http://www.python.org                   No Robot.txt <<<-- NOT CORRECT
1   http://www.junksiteIamtellingyou.com    No Robot.txt

Конечно, происходит то, что последнее значение итерации записывается по всему столбцу значений. Значение Robot должно быть "True" (что можно продемонстрировать, удалив нежелательный URL из фрейма данных.

Я пробовал несколько разных вариантов.loc, но не могу заставить их работать. Кажется, они всегда добавляют строки, а не обновляют новый столбец для существующей строки.

Итак, есть ли способ указать обновляемый столбец (с результатом функции)? Возможно использование.loc(местоположение), или возможно есть другой способ, такой как использование лямбды? Буду признателен за вашу помощь.

1 ответ

Есть apply для этого:

import robotparser
import urlparse
import pandas as pd
df = pd.DataFrame(dict(A=['http://www.python.org'
                          ,'http://www.junksiteIamtellingyou.com']))

def parse(i, agent_name):
    try:
        parser = robotparser.RobotFileParser()
        parser.set_url(urlparse.urljoin(i, "robots.txt"))
        parser.read()
    except Exception as e:
        return 'No Robot.txt'
    else:
        return parser.can_fetch(agent_name, i)

df['Robot'] = df['A'].apply(parse, args=('Test',))
Другие вопросы по тегам