Перебирая список списков, затем создайте фрейм данных

У меня есть список, содержащий подсписки. Я хочу просмотреть весь подсписок и извлечь данные, сохранить их в отдельных списках, а затем создать фрейм данных. Когда я пытаюсь это сделать, значения путаются....


fulllist = [
[
{'Variable': 'First_Name',
 'Answer': 'Anne'},
{'Variable': 'Middle_Name',
 'Answer': 'Wanjohi'},
{'Variable': 'Age',
 'Answer': '50'},
{'Variable': 'Country',
 'Answer': 'Uganda'}],

[
{'Variable': 'First_Name',
 'Answer': 'John'},
{'Variable': 'Middle_Name',
 'Answer': 'Wagwara'},
{'Variable': 'Country',
 'Answer': 'Kenya'}
],

[
{'Variable': 'First_Name',
 'Answer': 'Jeff'},
{'Variable': 'Middle_Name',
 'Answer': 'Simboyi'},
{'Variable': 'Age',
 'Answer': '20'},
{'Variable': 'Country',
 'Answer': 'UK'}],

 [
{'Variable': 'First_Name',
 'Answer': 'Ken'},
{'Variable': 'Middle_Name',
 'Answer': 'Kumbua'},
{'Variable': 'Country',
 'Answer': 'Tanzania'}
]

]

First_Name = [] 
Middle_Name = []
Age = []
Country = []


for i in range(len(fulllist)):
    try:
        First_Name.append(fulllist[i][0]['Answer'])
        Middle_Name.append(fulllist[i][1]['Answer'])
        Age.append(fulllist[i][2]['Answer'])
        Country.append(fulllist[i][3]['Answer'])
    except IndexError:
        print(i)

print(Age)
print(Country)

возможно это [{r['Variable']: r['Answer'] for r in row} for row in fulllist]

marmeladze 12.03.2024 09:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема, с которой вы столкнулись, связана с предположением, что каждый подсписок в полном списке будет содержать один и тот же набор ключей в словарях. Однако, как видно из ваших данных, не все подсписки содержат ключ «Возраст». Чтобы решить эту проблему, вам необходимо обрабатывать случаи, когда ключ может отсутствовать.

Вот модифицированная версия вашего кода, которая обрабатывает недостающие ключи:

import pandas as pd

fulllist = [
    [
        {'Variable': 'First_Name', 'Answer': 'Anne'},
        {'Variable': 'Middle_Name', 'Answer': 'Wanjohi'},
        {'Variable': 'Age', 'Answer': '50'},
        {'Variable': 'Country', 'Answer': 'Uganda'}
    ],
    [
        {'Variable': 'First_Name', 'Answer': 'John'},
        {'Variable': 'Middle_Name', 'Answer': 'Wagwara'},
        {'Variable': 'Country', 'Answer': 'Kenya'}
    ],
    [
        {'Variable': 'First_Name', 'Answer': 'Jeff'},
        {'Variable': 'Middle_Name', 'Answer': 'Simboyi'},
        {'Variable': 'Age', 'Answer': '20'},
        {'Variable': 'Country', 'Answer': 'UK'}
    ],
    [
        {'Variable': 'First_Name', 'Answer': 'Ken'},
        {'Variable': 'Middle_Name', 'Answer': 'Kumbua'},
        {'Variable': 'Country', 'Answer': 'Tanzania'}
    ]
]

First_Name = [] 
Middle_Name = []
Age = []
Country = []

for sublist in fulllist:
    temp_dict = {d['Variable']: d['Answer'] for d in sublist}
    First_Name.append(temp_dict.get('First_Name', ''))
    Middle_Name.append(temp_dict.get('Middle_Name', ''))
    Age.append(temp_dict.get('Age', ''))
    Country.append(temp_dict.get('Country', ''))

df = pd.DataFrame({'First_Name': First_Name, 'Middle_Name': Middle_Name, 'Age': Age, 'Country': Country})
print(df)

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

Moses 12.03.2024 09:07
[ {'Variable': 'First_Name', 'Answer': 'John'}, {'Variable': 'Middle_Name', 'Answer': 'Wagwara'}, {'Variable': 'Country', 'Answer': 'Kenya'} ] Для этого возраста не дан ответ, поэтому он отсутствует в этом подсписке.
Moses 12.03.2024 09:08

Великолепный! Это сработало, как задумано!

Moses 12.03.2024 09:39
stackoverflow.com/help/ai-policy
DavidW 12.03.2024 14:16
Ответ принят как подходящий

порядок элементов внутри каждого подсписка в полном списке одинаков, но в некоторых случаях, например, во втором подсписке, переменная «Возраст» отсутствует, что приводит к IndexError. Более надежный подход — перебирать каждый подсписок и динамически извлекать значения на основе ключа «Переменная».

# Initialize empty dictionaries for each variable
data = {'First_Name': [], 'Middle_Name': [], 'Age': [], 'Country': []}

# Iterate over each sublist
for sublist in fulllist:
    # Initialize variables to None
    first_name = middle_name = age = country = None
    # Iterate over each dictionary in the sublist
    for item in sublist:
        if item['Variable'] == 'First_Name':
            first_name = item['Answer']
        elif item['Variable'] == 'Middle_Name':
            middle_name = item['Answer']
        elif item['Variable'] == 'Age':
            age = item['Answer']
        elif item['Variable'] == 'Country':
            country = item['Answer']
    
    # Append values to respective lists
    data['First_Name'].append(first_name)
    data['Middle_Name'].append(middle_name)
    data['Age'].append(age)
    data['Country'].append(country)

# Create DataFrame
df = pd.DataFrame(data)
print(df)

Выход-

  First_Name Middle_Name   Age   Country
0       Anne     Wanjohi    50    Uganda
1       John     Wagwara  None     Kenya
2       Jeff     Simboyi    20        UK
3        Ken      Kumbua  None  Tanzania
import pandas as pd


fulllist = [
[
{'Variable': 'First_Name',
 'Answer': 'Anne'},
{'Variable': 'Middle_Name',
 'Answer': 'Wanjohi'},
{'Variable': 'Age',
 'Answer': '50'},
{'Variable': 'Country',
 'Answer': 'Uganda'}],

[
{'Variable': 'First_Name',
 'Answer': 'John'},
{'Variable': 'Middle_Name',
 'Answer': 'Wagwara'},
{'Variable': 'Country',
 'Answer': 'Kenya'}
],

[
{'Variable': 'First_Name',
 'Answer': 'Jeff'},
{'Variable': 'Middle_Name',
 'Answer': 'Simboyi'},
{'Variable': 'Age',
 'Answer': '20'},
{'Variable': 'Country',
 'Answer': 'UK'}],

 [
{'Variable': 'First_Name',
 'Answer': 'Ken'},
{'Variable': 'Middle_Name',
 'Answer': 'Kumbua'},
{'Variable': 'Country',
 'Answer': 'Tanzania'}
]

]

lst = []

# Create a list consists of dictionaries with details of each person
for x in fulllist:
    sub = {}
    for y in x:
        key = y['Variable']
        value = y['Answer']
        sub[key] = value
    lst.append(sub)

# As 'Age' is not available for some of the data mention 'Not available' for them
for x in lst:
    if 'Age' not in x.keys():
        x['Age'] = 'Not available'

# Create modified_dct keys being First_Name and values being a list of other data
modified_dct  = {}
for i, x in enumerate(lst):
    sub = []
    sub.append(x['Middle_Name'])
    sub.append(x['Age'])
    sub.append(x['Country'])
    modified_dct[x['First_Name']] = sub

# Convert to dataframe
df = pd.DataFrame(modified_dct, index = ['Middle_Name', 'Age', 'Country'])

print(df)


     
'''Output:
                Anne           John     Jeff            Ken
Middle_Name  Wanjohi        Wagwara  Simboyi         Kumbua
Age               50  Not available       20  Not available
Country       Uganda          Kenya       UK       Tanzania
'''

отредактировано добавление индекса

Suramuthu R 12.03.2024 09:58

Другие вопросы по теме