在列中计算唯一值

时间:2019-05-22 15:51:30

标签: python pandas

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

sample dataframe

我想知道每个小部件出现在“类别”列中的次数。此示例中的结果将是:

小部件1 = 6,小部件2 = 6,小部件3 = 6,小部件4 = 1

我可以使用.value_counts

df["category"].value_counts()

但是那只会返回完全相同的行。

enter image description here

我可以使用value_counts并输入每个值进行计数,但是在实际的DataFrame中,该列中的行和唯一值太多,以致于无法实用。

还有,如果单行包含两个相同的值,有没有办法不重复计算?例如,在同一行中有一个“ widget1,黑色widget1,黄色widget1”,我只想将其视为一个widget1。

3 个答案:

答案 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()