从包含列表元素的系列中创建堆叠的pandas系列

4

我有一个Pandas系列,其中元素是列表:

import pandas as pd
s = pd.Series([ ['United States of America'],['China', 'Hong Kong'], []])
print(s)

0    [United States of America]
1            [China, Hong Kong]
2                            []

如何获得以下这样的系列:
0 United States of America
1 China
1 Hong Kong

我不确定2会发生什么。

4个回答

4
以下选项都会返回Series。创建一个新框架并将其转换为列表形式。
pd.DataFrame(s.tolist()).stack()

0  0    United States of America
1  0                       China
   1                   Hong Kong
dtype: object

重置索引,请使用

pd.DataFrame(s.tolist()).stack().reset_index(drop=True)

0    United States of America
1                       China
2                   Hong Kong
dtype: object

要转换为DataFrame,请调用to_frame()
pd.DataFrame(s.tolist()).stack().reset_index(drop=True).to_frame('countries')

                  countries
0  United States of America
1                     China
2                 Hong Kong

如果您想进行代码高尔夫比赛,请使用:
sum(s, [])
# ['United States of America', 'China', 'Hong Kong']

pd.Series(sum(s, []))

0    United States of America
1                       China
2                   Hong Kong
dtype: object

甚至可以说,

pd.Series(np.sum(s))

0    United States of America
1                       China
2                   Hong Kong
dtype: object

然而,像大多数涉及列表求和的操作一样,这种做法在性能方面较差(列表连接操作效率低下)。


使用 itertools.chain 进行链接操作可以获得更快的速度:

from itertools import chain
pd.Series(list(chain.from_iterable(s)))

0    United States of America
1                       China
2                   Hong Kong
dtype: object

pd.DataFrame(list(chain.from_iterable(s)), columns=['countries'])

                  countries
0  United States of America
1                     China
2                 Hong Kong

2
最初的回答
或者使用:
df = pd.DataFrame(s.tolist())
print(df[0].fillna(df[1].dropna().item()))

输出:

0    United States of America
1                       China
2                   Hong Kong
Name: 0, dtype: object

2

Assuming that is list

pd.Series(s.sum())
Out[103]: 
0    United States of America
1                       China
2                   Hong Kong
dtype: object

1

有一个更简单、可能计算成本更低的方法是通过 pandas 函数 explode 来实现。请参见 此处。在您的情况下,答案如下:

s.explode()

很简单!在有多列的情况下,您可以通过在文字中添加它的名称来指定要“展开”的列,例如s.explode('country')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接