Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫在同一列中获得一起使用最频繁的值_Python_Pandas - Fatal编程技术网

Python 熊猫在同一列中获得一起使用最频繁的值

Python 熊猫在同一列中获得一起使用最频繁的值,python,pandas,Python,Pandas,我的数据集只包含两列user\u id和channel。通道列可以采用预定义列表中的值[a、b、c、d]。有多行具有相同的用户id。每行可以包含上述任何通道 如果考虑每个用户访问的唯一信道,哪个集合最频繁发生? 数据帧示例: >>> df = pd.DataFrame([[1, 'a'], [1, 'b'], [1, 'b'], [1,'b'], [2,'c'], [2,'a'], [2,'a'], [2,'b'], [3,'a'], [3,'b']], columns=['u

我的数据集只包含两列
user\u id
channel
。通道列可以采用预定义列表中的值
[a、b、c、d]
。有多行具有相同的
用户id
。每行可以包含上述任何通道

如果考虑每个用户访问的唯一信道,哪个集合最频繁发生?

数据帧示例:

>>> df = pd.DataFrame([[1, 'a'], [1, 'b'], [1, 'b'], [1,'b'], [2,'c'], [2,'a'], [2,'a'], [2,'b'], [3,'a'], [3,'b']], columns=['user_id', 'Channel'])
>>> df
   user_id Channel
0        1       a
1        1       b
2        1       b
3        1       b
4        2       c
5        2       a
6        2       a
7        2       b
8        3       a
9        3       b
预期解决方案:

对于上面的示例,将类似于:

  • 对于
    user_id==1
    而言,唯一通道集是
    {a,b}
    ,并且该组合计数一次
  • 对于
    user_id==2
    而言,唯一通道集是
    {a,b,c}
    ,并且该组合计数一次。请注意,这不计入这些唯一通道的任何子集
  • 对于
    user_id==3
    而言,唯一通道集是
    {a,b}
    ,并且该组合计数一次
如果我们为每个
用户id
计算一个唯一频道组合,我们应该得到

>>> df_result = pd.DataFrame([['a,b', 2], ['a,b,c', 1]], columns=['Channels_together', 'n'])
>>> df_result
  Channels_together  n
0               a,b  2
1             a,b,c  1
我已经想出了一个解决方案,它是旋转表格,这样我就可以得到
用户id
,以及
a
b
c
d
,然后给每个通道列分配一个整数,如果不是NA,那么就跨列求和,并将结果转换回每个组合

我确信有更好的方法可以做到这一点,但我似乎不知道如何做到。

frozenset
是可散列且可计数的

df.groupby('user_id').Channel.apply(frozenset).value_counts()

(a, b)       2
(a, b, c)    1
Name: Channel, dtype: int64
我们可以根据OP的功能来调整它

c = df.groupby('user_id').Channel.apply(frozenset).value_counts()
pd.DataFrame({'Channels_together': c.index.str.join(', '), 'n': c.values})

  Channels_together  n
0              a, b  2
1           a, b, c  1
或者

df.groupby('user_id').Channel.apply(frozenset).str.join(', ') \
  .value_counts().rename_axis('Channels_together').reset_index(name='n')

  Channels_together  n
0              a, b  2
1           a, b, c  1
frozenset
是可散列且可计数的

df.groupby('user_id').Channel.apply(frozenset).value_counts()

(a, b)       2
(a, b, c)    1
Name: Channel, dtype: int64
我们可以根据OP的功能来调整它

c = df.groupby('user_id').Channel.apply(frozenset).value_counts()
pd.DataFrame({'Channels_together': c.index.str.join(', '), 'n': c.values})

  Channels_together  n
0              a, b  2
1           a, b, c  1
或者

df.groupby('user_id').Channel.apply(frozenset).str.join(', ') \
  .value_counts().rename_axis('Channels_together').reset_index(name='n')

  Channels_together  n
0              a, b  2
1           a, b, c  1

您可以使用
groupby.apply(set)
,然后使用
.value\u counts
对值进行计数:

df.groupby('user_id')['Channel'].apply(set).value_counts()\
  .reset_index(name='n')\
  .rename(columns={'index':'Channels_together'})
输出

  Channels_together  n
0            {a, b}  2
1         {a, c, b}  1
  Channels_together  n
0              a, b  2
1           a, b, c  1

如果您希望值采用
str
格式,我们可以编写
lambda
函数对集合进行排序并将其转换为字符串:

df.groupby('user_id')['Channel'].apply(lambda x: ', '.join(sorted(set(x)))).value_counts()\
  .reset_index(name='n')\
  .rename(columns={'index':'Channels_together'})
输出

  Channels_together  n
0            {a, b}  2
1         {a, c, b}  1
  Channels_together  n
0              a, b  2
1           a, b, c  1

您可以使用
groupby.apply(set)
,然后使用
.value\u counts
对值进行计数:

df.groupby('user_id')['Channel'].apply(set).value_counts()\
  .reset_index(name='n')\
  .rename(columns={'index':'Channels_together'})
输出

  Channels_together  n
0            {a, b}  2
1         {a, c, b}  1
  Channels_together  n
0              a, b  2
1           a, b, c  1

如果您希望值采用
str
格式,我们可以编写
lambda
函数对集合进行排序并将其转换为字符串:

df.groupby('user_id')['Channel'].apply(lambda x: ', '.join(sorted(set(x)))).value_counts()\
  .reset_index(name='n')\
  .rename(columns={'index':'Channels_together'})
输出

  Channels_together  n
0            {a, b}  2
1         {a, c, b}  1
  Channels_together  n
0              a, b  2
1           a, b, c  1

请花点时间阅读这篇文章,以及如何提供答案并相应地修改您的问题
df.groupby('channel').count()
?不,我需要经常在一起的观察结果,不仅仅是小组中最常见的。创建一个小测试数据集,并显示此小测试数据集的预期结果。根据您的示例数据集,预期输出是什么?请花时间阅读此帖子,以及如何提供答案并相应修改您的问题
df.groupby('channel')。count()
?不,我需要经常在一起的观察结果,而不仅仅是组中最频繁的观察结果。创建一个小测试数据集,并显示此小测试数据集的预期结果。基于示例数据集,预期输出是什么?谢谢!您的第一个解决方案给了我一个错误
TypeError:unhabable type:“set”
,但第二个解决方案工作得很好!!这取决于你如何看待它。如果只得到每个组的唯一值,那么结果对我来说是有意义的@piRSquared,但我也理解你的方法,但这与OP expects.OP在他们的评论中阐明的不同。我同意,谢谢你!您的第一个解决方案给了我一个错误
TypeError:unhabable type:“set”
,但第二个解决方案工作得很好!!这取决于你如何看待它。如果只得到每个组的唯一值,那么结果对我来说是有意义的@piRSquared,但我也理解你的方法,但这与OP expects.OP在他们的评论中阐明的不同。我同意。