假设我的数据框如下所示:
column_name
1 book
2 fish
3 icecream|book
4 fish
5 campfire|book
现在,如果我使用df['column_name'].value_counts()
,它将告诉我fish
是最常见的值。
但是,我希望返回book
,因为第1、3和5行包含单词'book'。
我知道.value_counts()
将icecream|book
识别为一个值,但是有一种方法可以通过计算每个列单元格包含某个值的次数来确定最频繁的值,因此'最频繁的值吗?
答案 0 :(得分:5)
a = df['column_name'].str.split('|', expand=True).stack().value_counts()
print (a)
book 3
fish 2
icecream 1
campfire 1
dtype: int64
或Counter
具有对列表的理解和扁平化:
from collections import Counter
a = pd.Series(Counter([y for x in df['column_name'] for y in x.split('|')]))
print (a)
book 3
fish 2
icecream 1
campfire 1
dtype: int64
答案 1 :(得分:4)
pd.value_counts
您还可以将列表传递给value_counts
函数。请注意,我将join
除以|
,然后除以|
。
pd.value_counts('|'.join(df.column_name).split('|'))
book 3
fish 2
icecream 1
campfire 1
dtype: int64
get_dummies
之所以有用,是因为您的数据是用|
作为分隔符来构造的。如果您使用其他分隔符,请将其传递给get_dummies
调用df.column_name.str.get_dummies(sep='|').sum()
df.column_name.str.get_dummies().sum()
book 3
campfire 1
fish 2
icecream 1
dtype: int64
如果要对结果进行排序
df.column_name.str.get_dummies().sum().sort_values(ascending=False)
book 3
fish 2
icecream 1
campfire 1
dtype: int64
pd.factorize
和np.bincount
请注意,我join
整列并再次拆分。
f, u = pd.factorize('|'.join(df.column_name).split('|'))
pd.Series(np.bincount(f), u)
book 3
fish 2
icecream 1
campfire 1
dtype: int64
要排序,我们可以像上面一样使用sort_values
。或者这个
f, u = pd.factorize('|'.join(df.column_name).split('|'))
counts = np.bincount(f)
a = counts.argsort()[::-1]
pd.Series(counts[a], u[a])
book 3
fish 2
campfire 1
icecream 1
dtype: int64
答案 2 :(得分:2)
使用collections.Counter
+ itertools.chain
:
from collections import Counter
from itertools import chain
c = Counter(chain.from_iterable(df['column_name'].str.split('|')))
res = pd.Series(c)
print(res)
book 3
campfire 1
fish 2
icecream 1
dtype: int64