我有一系列表格:
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()
没用。 我做错了什么?
答案 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')
答案 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)