我有一个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
答案 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