Python 计算列中的唯一值
我有一个df,它有一列,每行有多个逗号分隔的值。我想计算一个唯一值在该列中出现的次数 df如下所示:Python 计算列中的唯一值,python,pandas,Python,Pandas,我有一个df,它有一列,每行有多个逗号分隔的值。我想计算一个唯一值在该列中出现的次数 df如下所示: category country 0 widget1, widget2, widget3, widget4 USA 1 widget1, widget3 USA 2 widget1, widget2 China 3
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,这对我不起作用。我在想原因,但这对我不起作用。我在想原因。