在 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()
没用。 我做错了什么?
【问题讨论】:
请记住,Series
和 DataFrames
并不是真的要包含列表;您可以做到,但您无法轻松访问许多不错的功能。
谢谢,这是一个很好的建议。但是,如果日期是由元素索引的列表,就像这个例子中一样?
【参考方案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 中展平系列,即元素为列表的系列的主要内容,如果未能解决你的问题,请参考以下文章
python 展平一系列Excel列,这些列在单元格中包含列表,同时保留行。允许为不可打印的U设置错误级别