2017-01-30 4 views
1

Я пытаюсь изменить весь столбец значений, но у меня все еще есть проблемы с отсутствием диапазона. Это весь мой код:Применить функцию, вызванную индексом списка за пределами диапазона

# Libraries 
import json, requests 
import pandas as pd 
from pandas.io.json import json_normalize 

# Set URL 
url = 'https://api-v2.themuse.com/jobs' 

# For loop to extract data 
for i in range(100): 
    data = json.loads(requests.get(
     url=url, 
     params={'page': i} 
    ).text)['results'] 

# JSON to PANDAS 
data_norm = pd.read_json(json.dumps(data)) 

# Modify two columns' values 
data_norm.locations = data_norm.locations.apply(lambda x: [{x[0]['name']}]) 
data_norm.publication_date = pd.to_datetime(data_norm.publication_date) 

Проблема здесь состоит в том, что, когда я использую функцию

data_norm.locations = data_norm.locations.apply(lambda x: [{x[0]['name']}]) 

Я получаю следующее сообщение об ошибке:

IndexError: list index out of range 

В идеале, я хочу изменить location колонки из этого:

0    [{'name': 'Seattle, WA'}] 
1 [{'name': 'San Francisco Bay Area'}] 
2    [{'name': 'Palo Alto, CA'}] 
3     [{'name': 'Reno, NV'}] 
4          [] 
Name: locations, dtype: object 

в этом:

0      Seattle, WA 
1   San Francisco Bay Area 
2     Palo Alto, CA 
3      Reno, NV 
4          
Name: locations, dtype: object 
+1

шоу data_norm.head(), чтобы получить лучшую помощь. Тем не менее, звучит так, что индекс data_norm не является целым числом или не имеет 0 в нем по меньшей мере – Boud

+0

@Boud Просто обновил исходное сообщение –

ответ

2
data_norm.locations = data_norm.locations.apply(lambda x: 
               [{x[0].get('name', '')}] 
               if len(x) > 0 else [] 
               ) 

Заметим, что это предполагает, что если эта запись содержит по меньшей мере один элемент, первый элемент представляет собой словарь. Проблема с вашим кодом заключается в том, что вы пытались получить доступ к первому (индексному) элементу массива, который был пуст.

EDIT

Для удаления [{}], как на ваш комментарий:

data_norm.locations = data_norm.locations.apply(lambda x: 
               x[0].get('name', '') 
               if len(x) > 0 else '' 
               ) 
+0

Спасибо, это сработало! –

+0

Как удалить '[{}]' вокруг каждого значения? Например, я хочу удалить '[{}]', чтобы получить только 'Seattle, WA' –

+1

Просто обновил ответ для вас – scomes