Pandas серии списков в одну серию

У меня есть серия Pandas списков строк:

0                           [slim, waist, man]
1                                [slim, waistline]
2                                     [santa]

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

0 slim
1 waist
2 man
3 slim
4 waistline
5 santa

Я знаю, что могу разбить списки, используя

series_name.split(' ')

но мне трудно вернуть эти строки в один список.

спасибо!

5 ответов


вы в основном просто пытаетесь сгладить вложенный список здесь.

вы должны просто иметь возможность перебирать элементы серии:

slist =[]
for x in series:
    slist.extend(x)

или slicker (но труднее понять) понимание списка:

slist = [st for row in s for st in row]

вот простой метод, использующий только функции панд:

import pandas as pd

s = pd.Series([
    ['slim', 'waist', 'man'],
    ['slim', 'waistline'],
    ['santa']])

затем

s.apply(pd.Series).stack().reset_index(drop=True)

дает желаемый результат. В некоторых случаях вы можете сохранить исходный индекс и добавить второй уровень для индексирования вложенных элементов, например

0  0         slim
   1        waist
   2          man
1  0         slim
   1    waistline
2  0        santa

если это то, что вы хотите, просто опустить .reset_index(drop=True) из цепи.


вы можете попробовать использовать itertools.цепь, чтобы просто сгладить списки:

In [70]: from itertools import chain
In [71]: import pandas as pnd
In [72]: s = pnd.Series([['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']])
In [73]: s
Out[73]: 
0    [slim, waist, man]
1     [slim, waistline]
2               [santa]
dtype: object
In [74]: new_s = pnd.Series(list(chain(*s.values)))
In [75]: new_s
Out[75]: 
0         slim
1        waist
2          man
3         slim
4    waistline
5        santa
dtype: object

series_name.sum()

делает именно то, что вам нужно. Убедитесь, что это серия списков, иначе ваши значения будут объединены (если строка) или добавлены (если int)


вы можете использовать оператор конкатенации списка, как показано ниже -

lst1 = ['hello','world']
lst2 = ['bye','world']
newlst = lst1 + lst2
print(newlst)
>> ['hello','world','bye','world']

или вы можете использовать list.extend() функция, как показано ниже -

lst1 = ['hello','world']
lst2 = ['bye','world']
lst1.extend(lst2)
print(lst1)
>> ['hello', 'world', 'bye', 'world']

преимущества использования extend функция заключается в том, что она может работать на нескольких типах, где as concatenation оператор будет работать только если оба LHS и РГО списки.

другие примеры

lst1.extend(('Bye','Bye'))
>> ['hello', 'world', 'Bye', 'Bye']