在 pandas 中展平系列,即元素为列表的系列

Posted

技术标签:

【中文标题】在 pandas 中展平系列,即元素为列表的系列【英文标题】:Flatten a Series in pandas, i.e. a series whose elements are lists 【发布时间】:2014-07-24 12:43:15 【问题描述】:

我有一系列的表格:

s = Series([['a','a','b'],['b','b','c','d'],[],['a','b','e']])

看起来像

0       [a, a, b]
1    [b, b, c, d]
2              []
3       [a, b, e]
dtype: object

我想计算一下我总共有多少个元素。 我天真的试探喜欢

s.values.hist()

s.values.flatten()

没用。 我做错了什么?

【问题讨论】:

请记住,SeriesDataFrames 并不是真的要包含列表;您可以做到,但您无法轻松访问许多不错的功能。 谢谢,这是一个很好的建议。但是,如果日期是由元素索引的列表,就像这个例子中一样? 【参考方案1】:
s.map(len).sum()

成功了。 s.map(len)len() 应用于每个元素并返回一系列所有长度,然后您可以在该系列上使用sum

【讨论】:

非常感谢!如果我想要一个包含每个字母分布的直方图怎么办? 您可以使用import collections; s.map(collections.Counter).sum() 快速完成该操作。如果您以前没有看过 collections.Counter,请阅读它。【参考方案2】:

就个人而言,我喜欢在数据框中有数组,每个项目都有一个单独的列。它会给你更多的功能。所以,这是我的替代方法

>>> raw = [['a', 'a', 'b'], ['b', 'b', 'c', 'd'], [], ['a', 'b', 'e']]
>>> df = pd.DataFrame(raw)
>>> df
Out[217]: 
      0     1     2     3
0     a     a     b  None
1     b     b     c     d
2  None  None  None  None
3     a     b     e  None

现在,看看我们每行有多少个值

>>> df.count(axis=1)
Out[226]: 
0    3
1    4
2    0
3    3

在这里申请 sum() 会给你想要的。

其次,您在评论中提到的内容:获取分发。这里可能有一种更简洁的方法,但我仍然更喜欢下面的方法,而不是评论中给你的提示

>>> foo = [col.value_counts() for x, col in df.iteritems()]
>>> foo
Out[246]: 
[a    2
 b    1
 dtype: int64, b    2
 a    1
 dtype: int64, b    1
 c    1
 e    1
 dtype: int64, d    1
 dtype: int64]

foo 现在包含每一列的分布。列的解释仍然是“第 x 个值”,因此第 0 列包含数组中所有“第一个值”的分布。

下一步,“总结”。

>>> df2 = pd.DataFrame(foo)
>>> df2
Out[266]: 
    a   b   c   d   e
0   2   1 NaN NaN NaN
1   1   2 NaN NaN NaN
2 NaN   1   1 NaN   1
3 NaN NaN NaN   1 NaN
>>> test.sum(axis=0)
Out[264]: 
a    3
b    4
c    1
d    1
e    1
dtype: float64

请注意,对于这些非常简单的问题,一系列列表和每个项目都有列的数据框之间的差异并不大,但是一旦你想做真正的数据工作,后者会给你方式更多的功能。此外,它可能会更有效,因为您可以使用 pandas 内部方法。

【讨论】:

这个也很有用。实际上在我的列表中我有链接(来自爬虫),所以没有重复。我一定会尝试这种方法。看起来也更自然【参考方案3】:

如果我们像原来的问题一样坚持使用 pandas 系列,那么从 Pandas 0.25.0 版开始,一个简洁的选项是 Series.explode() 例程。它返回一个分解列表到行,这些行的索引将被复制。

问题的原始系列:

s = pd.Series([['a','a','b'],['b','b','c','d'],[],['a','b','e']])

让我们分解它,我们得到一个 Series,其中索引是重复的。 index表示原始列表的索引。

>>> s.explode()
Out:
0      a
0      a
0      b
1      b
1      b
1      c
1      d
2    NaN
3      a
3      b
3      e
dtype: object

>>> type(s.explode())
Out:
pandas.core.series.Series

要计算元素的数量,我们现在可以使用 Series.value_counts():

>>> s.explode().value_counts()
Out:
b    4
a    3
d    1
c    1
e    1
dtype: int64

还包括 NaN 值:

>>> s.explode().value_counts(dropna=False)
Out:
b      4
a      3
d      1
c      1
e      1
NaN    1
dtype: int64

最后,使用 Series.plot() 绘制直方图:

>>> s.explode().value_counts(dropna=False).plot(kind = 'bar')

【讨论】:

【参考方案4】:
import itertools
word_lists=[['apple','orange'],['red','yellow']]
vocab=list(set(itertools.chain.from_iterable(raw_data.word_lists)))

【讨论】:

以上是关于在 pandas 中展平系列,即元素为列表的系列的主要内容,如果未能解决你的问题,请参考以下文章

理解展平一系列序列? [复制]

根据另一列从 Pandas 系列中的列表中选择元素

python 展平一系列Excel列,这些列在单元格中包含列表,同时保留行。允许为不可打印的U设置错误级别

如果 pandas 系列的值是一个列表,如何获取每个元素的子列表?

如何在 Pandas 中连接包含列表(系列)的两列

开发中列表与对象有关系吗?