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

时间:2014-06-04 01:44:43

标签: python python-3.x pandas series

我有一系列表格:

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()

没用。 我做错了什么?

4 个答案:

答案 0 :(得分:4)

如果我们像原始问题中那样坚持使用熊猫系列,那么Series.explode()例程是熊猫(Pandas)0.25.0版之后的一个不错的选择。它会向行返回分解列表,其中这些行的索引将重复。

问题的原始系列:

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

让它爆炸,我们得到一个系列,在该系列中重复索引。索引表示原始列表的索引。

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

Histogram of the Series

答案 1 :(得分:1)

s.map(len).sum()

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

答案 2 :(得分:0)

就我个人而言,我喜欢在数据框中使用数组,每个单项都有一列。它将为您提供更多功能。所以,这是我的替代方法

>>> 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现在包含每列的分布。列的解释仍然是" xth值",这样第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

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

答案 3 :(得分:0)

import itertools
word_lists=[['apple','orange'],['red','yellow']]
vocab=list(set(itertools.chain.from_iterable(raw_data.word_lists)))

enter image description here