我有一个df,它的一列中每行都有多个逗号分隔的值。我想计算在该列中出现一个唯一值的次数。
df看起来像这样:
category country
0 widget1, widget2, widget3, widget4 USA
1 widget1, widget3 USA
2 widget1, widget2 China
3 widget2 Canada
4 widget1, widget2, widget3 China
5 widget2 Vietnam
6 widget3 Canada
7 widget1, widget3 USA
8 widget1, widget3 Japan
9 widget2 Germany
我想知道每个小部件出现在“类别”列中的次数。此示例中的结果将是:
小部件1 = 6,小部件2 = 6,小部件3 = 6,小部件4 = 1
我可以使用.value_counts
df["category"].value_counts()
但是那只会返回完全相同的行。
我可以使用value_counts并输入每个值进行计数,但是在实际的DataFrame中,该列中的行和唯一值太多,以致于无法实用。
还有,如果单行包含两个相同的值,有没有办法不重复计算?例如,在同一行中有一个“ widget1,黑色widget1,黄色widget1”,我只想将其视为一个widget1。
答案 0 :(得分:4)
使用get_dummies
df.category.str.get_dummies(',').replace(0,np.nan).stack().sum(level=1)
答案 1 :(得分:1)
另一种解决方案是将您的字符串unnest排成行,然后使用value_counts
:
explode_str(df, 'category', ',').value_counts()
widget2 6
widget1 6
widget3 6
widget4 1
Name: category, dtype: int64
链接答案中使用的功能:
def explode_str(df, col, sep):
s = df[col]
i = np.arange(len(s)).repeat(s.str.count(sep) + 1)
return df.iloc[i].assign(**{col: sep.join(s).split(sep)})
答案 2 :(得分:0)
这可能不是最优雅的解决方案,但我认为它应该可以工作。基本上,我们需要将“类别”列中的每个单词分开,然后对单词进行计数。
from itertools import chain
words=[','.split(i) for i in df['Category'].tolist()]
words=[i.strip() for i in chain.from_iterable(words)]
pd.Series(words).value_counts()