使用apply计算Pandas中列表中的元素

时间:2018-10-16 11:18:28

标签: python pandas

我有一个DataFrame:

df = pd.DataFrame({
'keywords': [['a', 'b', 'c'], ['c', 'd'], ['a', 'b', 'c', 'd'], ['b', 'c', 'g', 'h', 'i']]})

我想使用df.apply计算所有行中列表内DataFrame中元素的数量。我希望上面的DataFrame能够提供:

a: 2
b: 3
c: 4
d: 2
g: 1
h: 1
i: 1

2 个答案:

答案 0 :(得分:2)

首先,请注意,您可以使用“ sum”串联列表,因为+可以串联Python中的列表:

df.keywords.sum()
# out: ['a', 'b', 'c', 'c', 'd', 'a', 'b', 'c', 'd', 'b', 'c', 'g', 'h', 'i']

然后:

import collections
collections.Counter(df.keywords.sum())
# out: Counter({'a': 2, 'b': 3, 'c': 4, 'd': 2, 'g': 1, 'h': 1, 'i': 1})

或者:

np.unique(df.keywords.sum(), return_counts=True)
# out: (array(['a', 'b', 'c', 'd', 'g', 'h', 'i'], dtype='<U1'),  array([2, 3, 4, 2, 1, 1, 1]))

或者:

uniq = np.unique(df.keywords.sum(), return_counts=True)
pd.Series(uniq[1], uniq[0])
# out:
a    2
b    3
c    4
d    2
g    1
h    1
i    1

或者:

pd.Series(collections.Counter(df.keywords.sum()))
# out: same as previous

在性能方面,无论您使用np.unique()还是collections.Counter都是差不多的,因为df.keywords.sum()实际上并不那么快。如果您关心性能,那么pure Python list flattening会更快:

collections.Counter([item for sublist in df.keywords for item in sublist])

答案 1 :(得分:1)

如果性能很重要,可以使用纯python解决方案与chain进行展平,并按Counter计算值,最后使用DataFrame构造函数:

from itertools import chain
from collections import Counter

c = Counter(chain.from_iterable(df['keywords'].tolist())) 

df = pd.DataFrame({'a': list(c.keys()), 'b':list(c.values())})
print (df)
   a  b
0  a  2
1  b  3
2  c  4
3  d  2
4  g  1
5  h  1
6  i  1

或者:

df = pd.DataFrame(df['keywords'].values.tolist()).stack().value_counts().to_frame('a')
print (df)
   a
c  4
b  3
a  2
d  2
g  1
i  1
h  1