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

Но мне сложно помещать эти строки в один список.

Спасибо!

Ответ 1

В основном вы просто пытаетесь свернуть вложенный список.

Вы должны просто выполнять итерацию по элементам серии:

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

или слайкер (но сложнее понять):

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

Ответ 2

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

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) из цепочки.

Ответ 3

series_name.sum()

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

Ответ 4

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

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

Ответ 5

В версии для панд 0.25.0 появился новый метод 'взорвать' для серий и фреймов данных. В старых версиях такого метода нет.

Это помогает получить нужный вам результат.

Например, у вас есть такие серии:

import pandas as pd

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

Тогда вы можете использовать

s.explode()

Чтобы получить такой результат:

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

В случае кадра данных:

df = pd.DataFrame({
  's': pd.Series([
    ['slim', 'waist', 'man'],
    ['slim', 'waistline'],
    ['santa']
   ]),
   'a': 1
})

У вас будет такой DataFrame:

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

Применение разнесения к столбцу s:

df.explode('s')

даст вам такой результат:

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

Ответ 6

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

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 заключаются в том, что она может работать на нескольких типах, где оператор concatenation работает только в том случае, если списки LHS и RHS являются списками.

Другие примеры функции extend -

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

Ответ 7

Сглаживание и разгибание могут быть сделаны с помощью этой функции

def flatten(df, col):
    col_flat = pd.DataFrame([[i, x] for i, y in df[col].apply(list).iteritems() for x in y], columns=['I', col])
    col_flat = col_flat.set_index('I')
    df = df.drop(col, 1)
    df = df.merge(col_flat, left_index=True, right_index=True)

    return df

Unflattening:

def unflatten(flat_df, col):
    flat_df.groupby(level=0).agg({**{c:'first' for c in flat_df.columns}, col: list})

После разворачивания мы получаем тот же самый фрейм данных, кроме порядка столбцов:

(df.sort_index(axis=1) == unflatten(flatten(df)).sort_index(axis=1)).all().all()
>> True

Ответ 8

Вы также можете попробовать:

combined = []
for i in s.index:
    combined = combined + s.iloc[i]

print(combined)

s = pd.Series(combined)
print(s)

выход:

['slim', 'waist', 'man', 'slim', 'waistline', 'santa']

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

dtype: object