rstrip
- строковая операция.Чтобы применить строковую операцию к серии Series
, сначала необходимо вызвать функцию str
для серии, которая позволяет выполнять векторизованные строковые операции с Series
.
В частности, вваш код, изменяющий ip.rstrip()
на ip.str.rstrip()
, должен разрешить ваш AttributeError
.
. Немного покопавшись, получается, что requests.get
операция, которую вы пытаетесь выполнить, не может быть векторизована в pandas
(см. Использование запросов Python для нескольких URL-адресов в кадре данных ).Я взломал следующее, что должно быть немного более эффективным, чем использование iterrows
Далее используется np.vectorize
для запуска функции для получения информации для каждого IP-адреса.Входные данные о местоположении сохраняются как новые столбцы в новом DataFrame.
Сначала я изменил вашу функцию get_ip
, чтобы она возвращала словарь location
, а не (location)
.
Далее ясоздал функцию векторизации, используя np.vectorize
:
vec_func = np.vectorize(lambda url: get_ip(url))
Наконец, vec_func
применяется к df
, чтобы создать новый DataFrame, который объединяет df
с выводом местоположения из vec_func
, где df[0]
это столбец с вашими URL:
new_df = pd.concat([df, pd.DataFrame(vec_func(df[0]), columns=["response"])["response"].apply(pd.Series)], axis=1)
Приведенный выше код извлекает ответ API в виде словаря для каждой строки в вашем DataFrame, а затем отображает словарь в столбцы в DataFrame.В конце ваш новый DataFrame будет выглядеть так:
0 lat lon region city org country query
0 85.56.19.4 37.3824 -5.9761 Andalusia Seville Orange Espana ES 85.56.19.4
1 188.85.165.103 41.6561 -0.8773 Aragon Zaragoza Vodafone Spain ES 188.85.165.103
2 81.61.223.131 40.3272 -3.7635 Madrid Leganés Vodafone Ono ES 81.61.223.131
Надеюсь, это устранит ошибку InvalidSchema
и даст вам немного лучшую производительность, чем iterrows()
.