Как заменить несколько элементов в списке и создать из него фрейм данных?

#python #pandas #list #dataframe

#python #pandas #Список #фрейм данных

Вопрос:

У меня есть тихий сложный список, в котором я пытаюсь изменить 2 вещи:

  1. id должно стать ID
  2. Field1 должно стать Value1

После этого я пытаюсь создать из него аккуратный фрейм данных. Это мой ожидаемый результат:

     ID    - Value1 
0    1    - 1235
1    2    - 5631
2    3    - 9875
3    4    - 2683
4    5    - 97525
5    6    - 6614
  

my_list выглядит так:

 my_list = [('www.url1.com'), 1000, [{'id': 1, 'Field1': 1235}, {'id': 2, 'Field1': 5631}, {'id': 3, 'Field1': 9875}, 'www.google.com)'],
            ('www.url1.com'), 1000, [{'id': 4, 'Field1': 2683}, {'id': 5, 'Field1': 97525}, {'id': 6, 'Field1': 6614}, 'www.google.com)']]
  

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

 import pandas as pd

my_list = [('www.url1.com'), 1000, [{'id': 1, 'Field1': 1235}, {'id': 2, 'Field1': 5631}, {'id': 3, 'Field1': 9875}, 'www.google.com)'],
            ('www.url1.com'), 1000, [{'id': 4, 'Field1': 2683}, {'id': 5, 'Field1': 97525}, {'id': 6, 'Field1': 6614}, 'www.google.com)']]

  
for n, i in enumerate(my_list):
    if i == 'id':
        my_list[n] = 'ID'
        

# print(my_list)

df = pd.DataFrame(my_list)

#print(df)
  

Комментарии:

1. почему другие элементы в списке не включены в фрейм данных?

2. @deadshot потому что они не имеют отношения к моему фрейму данных.

Ответ №1:

Нужные вам данные внутри списка. вы можете использовать isinstance для фильтрации списка, а затем внутри списка выбрать все элементы, тип которых dict затем создайте новый словарь, используя новые ключи {'id': 'ID', 'Field1': 'Value1'} .

 keys = {'id': 'ID', 'Field1': 'Value1'}

res = []
for x in my_list: 
    if isinstance(x, list):
        res  = [{keys[k]: y[k] for k in keys} for y in x if isinstance(y, dict)]

df = pd.DataFrame(res)
print(df)
  

Использование понимания списка

 keys = {'id': 'ID', 'Field1': 'Value1'}
res = [y for x in my_list if isinstance(x, list) for y in x if isinstance(y, dict)]
df = pd.DataFrame(res).rename(columns=keys)
  

Вывод:

    ID  Value1
0   1    1235
1   2    5631
2   3    9875
3   4    2683
4   5   97525
5   6    6614
  

Комментарии:

1. Спасибо. Вы отлично справились, может быть, вы можете объяснить, что вы сделали?

2. Почему, когда я применяю ваш код к гораздо большему my_list, я не получаю никакого результата?

3. попробуйте напечатать res он пустой?

Ответ №2:

Вы можете выбрать только списки с идентификаторами и объединить их:

 from functools import reduce
my_list = [('www.url1.com'), 1000, [{'id': 1, 'Field1': 1235}, {'id': 2, 'Field1': 5631}, {'id': 3, 'Field1': 9875}, 'www.google.com)'],
            ('www.url1.com'), 1000, [{'id': 4, 'Field1': 2683}, {'id': 5, 'Field1': 97525}, {'id': 6, 'Field1': 6614}, 'www.google.com)']]

a = reduce(lambda x,y: x y,[my_list[2::3][i][-2::-1] for i in range(len(my_list[2::3]))])

pd.DataFrame(a).rename(columns = {"id":"ID","Field1":"Value1"})
  

Вывод:

     ID  Value1
0   3   9875
1   2   5631
2   1   1235
3   6   6614
4   5   97525
5   4   2683
  

Просто отсортируйте по идентификатору, если вам это нужно.

Комментарии:

1. Выглядит правильно, но довольно сложно… Хотя спасибо.