Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 展平pandas中的系列,即元素为列表的系列_Python_Python 3.x_Pandas_Series - Fatal编程技术网

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()
。阅读
集合。如果您以前没有看到过,请使用计数器进行计数。请记住
系列
数据帧
实际上并不包含列表;你们可以这样做,但你们会失去很多好的功能。谢谢,这是一个很好的建议。但是,如果日期是按元素索引的列表,如本例中所示,该怎么办?这也是非常有用的。实际上在我的列表中我有链接(来自爬虫),所以没有重复的链接。我一定会尝试这种方法。这似乎也更自然