#python #pandas
#python #pandas
Вопрос:
Эй, ребята, я пытаюсь отфильтровать вложенный список, чтобы включать только строки, содержащие слово «желтый». Моя цель — сохранить каждый цвет в отдельном столбце в моем фрейме данных
Я попробовал labels.str.split (‘yellow’), но он просто говорит мне, что объект ‘list’ не имеет атрибута ‘str’
[['Example1 (purple)',
' Example2 (blue)',
' Example3 (orange)',
' Example4 (yellow)',
' Example5 (red)',
' Example6 (pink)',
' Example7 (sky)'],
['Example8 (purple)',
' Example9 (blue)',
' Example10 (orange)',
' Example11 (sky)',
' Example12 (green)',
' Example13 (green)',
' Example14 (yellow)',
' Example15 (red)',
' Example16 (pink)',
' Example17 (pink)',
' Example18 (green)',
' Example19 (sky)']]
Комментарии:
1. Вы хотите
[[yellow], [yellower]]
или[yellow, yellower]
?2. У вас нет фрейма данных или какого-либо объекта Pandas. Это просто обычный список Python. Вы не можете использовать методы Pandas для списков.
3. Я хочу, чтобы каждый пример соответствовал цвету. Итак [[‘Example4’], [‘Example14’]]
4. Вы имели в виду, что в Example3 отсутствует пробел? есть ли какие-либо без пробелов между ними?
5. Это просто объект с некоторыми данными, которые я сохранил из своего исходного фрейма данных
Ответ №1:
Если вы не хотите сохранять внутренние списки, вы можете сделать это с двойным пониманием списка:
[item for inner in my_list for item in inner if 'yellow' in item]
дает:
[‘ Example4 (желтый)’, ‘Example14 (желтый)’]
Если вы хотите сохранить внутренние списки, вы можете сделать это следующим образом:
[ [item for item in inner if 'yellow' in item] for inner in my_list ]
дает:
[[‘ Example4 (желтый)’], [‘Example14 (желтый)’]]
Ответ №2:
Импортируйте необходимые пакеты и инициализируйте данные:
import pandas as pd
import re
my_list = [['Example1 (purple)',
' Example2 (blue)',
' Example3 (orange)',
' Example4 (yellow)',
' Example5 (red)',
' Example6 (pink)',
' Example7 (sky)'],
['Example8 (purple)',
' Example9 (blue)',
' Example10 (orange)',
' Example11 (sky)',
' Example12 (green)',
' Example13 (green)',
' Example14 (yellow)',
' Example15 (red)',
' Example16 (pink)',
' Example17 (pink)',
' Example18 (green)',
' Example19 (sky)']]
Сгладьте список, чтобы в списках не было вложенных списков. (Вот почему вы получили сообщение об ошибке, что списки не разделены. Если вы это сделаете [x.split() for x in my_list]
, это выдаст ошибку, потому что элементы, состоящие из my_list
списков)
Определите функцию flatlist и сгладьте список:
flat_list = lambda l: [item for sublist in l for item in sublist]
flat = flat_list(my_list)
Создайте пустой фрейм данных
df = pd.DataFrame({})
Извлеките элементы одного плоского списка. это удаляет из него пробелы, затем разбивает его на пробел, принимая 0-й элемент за «Example1», а затем снова удаляет его, чтобы удалить пробелы. сделайте это снова, но возьмите 1-й элемент для цвета. Оберните его в () и разделите запятой, чтобы вернуть его как кортеж.
splitout = [(x.strip().split(' ')[0].strip(), x.strip().split(' ')[1]) for x in pd.Series(flat)]
установите два столбца dataframe. первый просто захватывает первый элемент разделения, который всегда является примером, второй использует re.sub для удаления () из цвета
df['Example'] = [x[0] for x in splitout]
df['Color'] = [re.sub('[/(/)]', '', x[1]) for x in splitout]
Example Color
0 Example1 purple
1 Example2 blue
2 Example3 orange
3 Example4 yellow
4 Example5 red
5 Example6 pink
6 Example7 sky
7 Example8 purple
8 Example9 blue
9 Example10 orange
10 Example11 sky
11 Example12 green
12 Example13 green
13 Example14 yellow
14 Example15 red
15 Example16 pink
16 Example17 pink
17 Example18 green
18 Example19 sky
Затем вы можете выполнить поворот в больший фрейм данных с цветами для столбцов:
pd.pivot_table(df.assign(v=1), index='Example', columns='Color', values='v')
Color blue green orange pink purple red sky yellow
Example
Example1 NaN NaN NaN NaN 1.0 NaN NaN NaN
Example10 NaN NaN 1.0 NaN NaN NaN NaN NaN
Example11 NaN NaN NaN NaN NaN NaN 1.0 NaN
Example12 NaN 1.0 NaN NaN NaN NaN NaN NaN
Example13 NaN 1.0 NaN NaN NaN NaN NaN NaN
Example14 NaN NaN NaN NaN NaN NaN NaN 1.0
Example15 NaN NaN NaN NaN NaN 1.0 NaN NaN
Example16 NaN NaN NaN 1.0 NaN NaN NaN NaN
Example17 NaN NaN NaN 1.0 NaN NaN NaN NaN
Example18 NaN 1.0 NaN NaN NaN NaN NaN NaN
Example19 NaN NaN NaN NaN NaN NaN 1.0 NaN
Example2 1.0 NaN NaN NaN NaN NaN NaN NaN
Example3 NaN NaN 1.0 NaN NaN NaN NaN NaN
Example4 NaN NaN NaN NaN NaN NaN NaN 1.0
Example5 NaN NaN NaN NaN NaN 1.0 NaN NaN
Example6 NaN NaN NaN 1.0 NaN NaN NaN NaN
Example7 NaN NaN NaN NaN NaN NaN 1.0 NaN
Example8 NaN NaN NaN NaN 1.0 NaN NaN NaN
Example9 1.0 NaN NaN NaN NaN NaN NaN NaN
весь код:
import pandas as pd
import re
flat_list = lambda l: [item for sublist in l for item in sublist]
flat = flat_list(my_list)
splitout = [(x.strip().split(' ')[0].strip(), x.strip().split(' ')[1]) for x in pd.Series(flat)]
df = pd.DataFrame({})
df['Example'] = [x[0] for x in splitout]
df['Color'] = [re.sub('[/(/)]', '', x[1]) for x in splitout]
pivot = pd.pivot_table(df.assign(v=1), index='Example', columns='Color', values='v')