关于python:Pandas系列列表到一个系列

Pandas Series of lists to one series

我有一系列的熊猫串:

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

如您所见,列表的长度不同。我想要一个有效的方法把这个分解成一个系列

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

我知道我可以用

1
series_name.split(' ')

但我很难把这些字符串放回一个列表中。

谢谢!


以下是仅使用熊猫函数的简单方法:

1
2
3
4
5
6
import pandas as pd

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

然后

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

提供所需的输出。在某些情况下,您可能希望保存原始索引并添加第二个级别来索引嵌套元素,例如。

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

如果这是你想要的,只需从链中省略.reset_index(drop=True)


您基本上只是想在这里展平嵌套列表。

您应该能够迭代系列的元素:

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

或者一个圆滑(但更难理解)的列表理解:

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


您可以尝试使用itertools.chain简化列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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


1
series_name.sum()

做你所需要的。请确保它是一系列列表,否则您的值将被连接(如果是字符串)或添加(如果是int)


可以使用此函数进行展平和取消展平

1
2
3
4
5
6
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

取消修饰:

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

取消填充后,我们得到相同的数据帧,除了列顺序:

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


您可以使用下面的列表串联操作符-

1
2
3
4
5
lst1 = ['hello','world']
lst2 = ['bye','world']
newlst = lst1 + lst2
print(newlst)
>> ['hello','world','bye','world']

或者您可以使用下面的list.extend()函数-

1
2
3
4
5
lst1 = ['hello','world']
lst2 = ['bye','world']
lst1.extend(lst2)
print(lst1)
>> ['hello', 'world', 'bye', 'world']

使用extend功能的好处是,它可以在多种类型上工作,因为concatenation操作器只在左舵和右舵都被列出的情况下工作。

extend函数的其他示例-

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