熊猫系列列表到一个系列

问题描述 投票:21回答:8

我有一个熊猫系列的字符串列表:

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

您可以看到,列表的长度不同。我想要一种有效的方法将其分解为一个系列

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

我知道我可以使用这些方法分解列表

series_name.split(' ')

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

谢谢!

python string list pandas series
8个回答
11
投票

您基本上只是在这里尝试拼合嵌套列表。

您应该只可以迭代该系列的元素:

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

或较模糊(但较难理解)的列表理解:

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

34
投票

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

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)


7
投票
series_name.sum()

完全满足您的需求。请确保它是一系列列表,否则您的值将被连接(如果是字符串)或添加(如果是int)


5
投票

您可以尝试使用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

2
投票

在大熊猫版本中,0.25.0出现了一种新的“爆炸”方法,用于seriesdataframes。较旧的版本没有这种方法。

它有助于建立所需的结果。

例如,您有这样的系列:

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

0
投票

您可以使用如下所示的列表串联运算符-

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']

0
投票

可以使用此功能进行平整和不平整

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

展开:

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

0
投票

您也可以尝试:

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
© www.soinside.com 2019 - 2024. All rights reserved.