#python #pandas #list #dataframe
#python #pandas #Список #фрейм данных
Вопрос:
У меня есть тихий сложный список, в котором я пытаюсь изменить 2 вещи:
id
должно статьID
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. Выглядит правильно, но довольно сложно… Хотя спасибо.