Фильтрация вложенного списка в python

#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')