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',))