Python 展平pandas中的系列,即元素为列表的系列
我有一系列的表格:Python 展平pandas中的系列,即元素为列表的系列,python,python-3.x,pandas,series,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.map(len).sum() 这就是诀窍s.map(le
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.map(len).sum()
这就是诀窍s.map(len)
对每个元素应用len()
,并返回所有长度的序列,然后您可以对该序列使用sum
。个人而言,我喜欢在数据帧中使用数组,对于每一项,使用一列。它会给你更多的功能。所以,这里是我的替代方法
>>> 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包含数组中所有“第一个值”的分布
下一步,“总结它们”
请注意,对于这些非常简单的问题,一系列列表和每个项目都有列的dataframe之间的区别不大,但一旦您想要进行实际的数据工作,后者就为您提供了更多的功能。此外,它可能更有效,因为您可以使用pandas内部方法。如果我们像原始问题一样坚持使用pandas系列,则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
要计算元素的数量,我们现在可以使用序列。value\u counts():
>>> s.explode().value_counts()
Out:
b 4
a 3
d 1
c 1
e 1
dtype: int64
>>> s.explode().value_counts(dropna=False).plot(kind = 'bar')
还包括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()
Out:
b 4
a 3
d 1
c 1
e 1
dtype: int64
>>> s.explode().value_counts(dropna=False).plot(kind = 'bar')
非常感谢!如果我想要一个每个字母分布的柱状图呢?你可以用
导入集合来做一个快速版本;s、 映射(collections.Counter).sum()
。阅读集合。如果您以前没有看到过,请使用计数器进行计数。请记住系列
和数据帧
实际上并不包含列表;你们可以这样做,但你们会失去很多好的功能。谢谢,这是一个很好的建议。但是,如果日期是按元素索引的列表,如本例中所示,该怎么办?这也是非常有用的。实际上在我的列表中我有链接(来自爬虫),所以没有重复的链接。我一定会尝试这种方法。这似乎也更自然