У меня есть список, содержащий подсписки. Я хочу просмотреть весь подсписок и извлечь данные, сохранить их в отдельных списках, а затем создать фрейм данных. Когда я пытаюсь это сделать, значения путаются....
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)






Проблема, с которой вы столкнулись, связана с предположением, что каждый подсписок в полном списке будет содержать один и тот же набор ключей в словарях. Однако, как видно из ваших данных, не все подсписки содержат ключ «Возраст». Чтобы решить эту проблему, вам необходимо обрабатывать случаи, когда ключ может отсутствовать.
Вот модифицированная версия вашего кода, которая обрабатывает недостающие ключи:
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)
Не совсем. Программа, извлекающая данные, отфильтровывает недостающий столбец, чтобы он не экспортировался в основной список.
[ {'Variable': 'First_Name', 'Answer': 'John'}, {'Variable': 'Middle_Name', 'Answer': 'Wagwara'}, {'Variable': 'Country', 'Answer': 'Kenya'} ] Для этого возраста не дан ответ, поэтому он отсутствует в этом подсписке.
Великолепный! Это сработало, как задумано!
порядок элементов внутри каждого подсписка в полном списке одинаков, но в некоторых случаях, например, во втором подсписке, переменная «Возраст» отсутствует, что приводит к 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
'''
отредактировано добавление индекса
возможно это
[{r['Variable']: r['Answer'] for r in row} for row in fulllist]