Python 计算列中的唯一值

Python 计算列中的唯一值,python,pandas,Python,Pandas,我有一个df,它有一列,每行有多个逗号分隔的值。我想计算一个唯一值在该列中出现的次数 df如下所示: category country 0 widget1, widget2, widget3, widget4 USA 1 widget1, widget3 USA 2 widget1, widget2 China 3

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

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

widget1=6,widget2=6,widget3=6,widget4=1

我可以使用。value\u计数

df[“类别”]。值_计数()
但这只会返回完全相同的行

我可以使用value_counts并输入每个值进行计数,但在实际的数据帧中,该列中有太多行和唯一值,使其不实用


另外,如果一行包含两个相同的值,是否有办法避免重复计数?例如,如果在同一行中有一个“widget1,黑色widget1,黄色widget1”,我只想将其算作一个widget1。

使用
获取假人

df.category.str.get_dummies(',').replace(0,np.nan).stack().sum(level=1)

使用
get\u假人

df.category.str.get_dummies(',').replace(0,np.nan).stack().sum(level=1)

这可能不是最优雅的解决方案,但我认为它应该有效。基本上,我们需要将类别列中的每个单词分开,然后计算单词数

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

这可能不是最优雅的解决方案,但我认为它应该有效。基本上,我们需要将类别列中的每个单词分开,然后计算单词数

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

另一种解决方案是将字符串转换为行,然后使用
值\u计数

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)})

另一种解决方案是将字符串转换为行,然后使用
值\u计数

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)})

不要在你的问题中张贴图片,因为人们无法复制。您的数据已经在jupyter笔记本中,您只需执行
print(df)
,然后将输出复制粘贴到您的问题中即可。谢谢!我不知道。我真的很感激!您可以编辑您的问题并将数据粘贴到那里。再次:1<代码>打印(df)
2。选择输出3。按
ctrl+c
4。编辑您的问题,然后按ctrl+v组合键在此处修复问题。如果你想插入代码,请将它放在其中三个(`)字符之间,然后用其中三个字符再次关闭。不要在问题中张贴图片,因为人们无法复制。您的数据已经在jupyter笔记本中,您只需执行
print(df)
,然后将输出复制粘贴到您的问题中即可。谢谢!我不知道。我真的很感激!您可以编辑您的问题并将数据粘贴到那里。再次:1<代码>打印(df)2。选择输出3。按
ctrl+c
4。编辑您的问题,然后按ctrl+v组合键在此处修复问题。如果你想插入代码,把它放在三个(`)字符之间,然后用其中的三个字符再次关闭它。这似乎很有效!这将确保如果一个值在同一行中重复,它不会重复计数?@PythonFisher是的,dummies,将显示exit或not,如果两个相同的值仍然显示为1,这似乎很有效!这将确保如果一个值在同一行中重复,它不会重复计数?@PythonFisher是的,dummies,将显示exit或not,如果两个相同的值仍然显示为1,这对我不起作用。我在想原因,但这对我不起作用。我在想原因。