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