【问题标题】:How can I group by and count list value in dataframe如何在数据框中按列表值分组和计数
【发布时间】:2022-01-12 05:43:45
【问题描述】:

我有数据框

df = pd.DataFrame({'session_id': ['T01', 'T02', 'T03', 'T04', 'T05', 'T06', 'T07'],
                   'path': [array(['a', 'b', 'c'], dtype='<U1'),
                            array(['x', 'y', 'z'], dtype='<U1'),
                            array(['a', 'b', 'c'], dtype='<U1'),
                            array(['x', 'y', 'z'], dtype='<U1'),
                            array(['k'], dtype='<U1'),
                            array(['x', 'y', 'z'], dtype='<U1'),
                            array(['h', 'i'], dtype='<U1')],
                   'flag': [0, 1, 0, 0, 0, 1, 0],
                   'total_value': [0.02, 0.05, 0.02, 0.05, 0.001, 0.05, 0.03]})

喜欢下面这张表

| session_id |         path         | flag  |   total_value |
| ---------- | -------------------- | ----- | ------------- |
| T01        | [a,b,c]              | 0     | 0.020         |
| T02        | [x,y,z]              | 1     | 0.050         |
| T03        | [a,b,c]              | 0     | 0.020         |
| T04        | [x,y,z]              | 0     | 0.050         |
| T05        | [k]                  | 0     | 0.001         |
| T06        | [x,y,z]              | 1     | 0.050         |
| T07        | [h,i]                | 0     | 0.030         |

我想按路径、标志、total_value 和按 total_value desc 排序后的记录数进行分组。最终结果选择如下。


|         path         | flag  |   total_value |  count  |
| -------------------- | ----- | ------------- | ------- |
| [x,y,z]              | 1     | 0.050         |  2      |
| [x,y,z]              | 0     | 0.050         |  1      |
| [h,i]                | 0     | 0.030         |  1      |
| [a,b,c]              | 0     | 0.020         |  2      |
| [k]                  | 0     | 0.001         |  1      |

我尝试使用

df.groupby(['path', 'flag', 'total_value']).count()

但会显示错误

unhashable type: 'numpy.ndarray'

【问题讨论】:

  • 错误:不可散列的类型:'numpy.ndarray'
  • 您能否将此数据框作为字典包含在您的问题中?
  • 我该怎么办? @enke
  • 对不起,我不确定你的问题,但这个数据集是由这段代码创建的
  • 从集合导入 defaultdict df_paths = df.groupby('session_id')['event_name'].aggregate( lambda x: x.tolist()).reset_index()

标签: python pandas dataframe pandas-groupby


【解决方案1】:

该 groupby 的问题在于,正如错误消息所述,np.ndarrays 是可变的,因此不可散列,因此不能用作索引。但是元组是可散列的,因此您可以将'path' 列中的数组转换为元组,并将所需列上的groupby 转换为count 方法。

然后在操作之后,将'path'的值转换回np.arrays:

df['path'] = df['path'].apply(tuple)
out = df.groupby(['path', 'flag', 'total_value']).count().reset_index()
out['path'] = out['path'].apply(np.array)

输出:

        path  flag  total_value  session_id
0  [a, b, c]     0        0.020           2
1     [h, i]     0        0.030           1
2        [k]     0        0.001           1
3  [x, y, z]     0        0.050           1
4  [x, y, z]     1        0.050           2

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多