如何 DataFrame.groupby 包含列表变量的字段

How to DataFrame.groupby a field containing list variables

我有一个这样的数据框

import pandas as pd
df = pd.DataFrame({'key1':pd.Series(data = ['a','b','c','d'], index = [0,1,2,3]), 'key2':pd.Series(data = [3,4,2,3],index = [0,1,2,3]), 'key3':pd.Series(data = [0.3,0.5,0.3,0.3],index = [0,1,2,3]), 'key4':pd.Series(data = [[1,2,3],[4,3,6],[1,2,3],[1,2]], index = [0,1,2,3])})

我想做:

df.groupby('key4').describe()

但是它给出了一个错误。

我的目的是创建在 key4 中具有相似值的组

您可以先将该列转换为字符串,然后对其进行描述:

df.groupby(df.key4.astype(str)).describe()

您不能按任何包含不可散列类型的列分组,列表就是其中之一,例如,如果您这样做 df.groupby('key4').head() 会产生错误:

TypeError: unhashable type: 'list'

如果您使用元组作为数据,那么您可以对该列进行分组,您可以通过执行以下操作进行转换:

在[454]中:

df['key4'] = df['key4'].apply(lambda x: tuple(x))
df
Out[454]:
  key1  key2  key3       key4
0    a     3   0.3  (1, 2, 3)
1    b     4   0.5  (4, 3, 6)
2    c     2   0.3  (1, 2, 3)
3    d     3   0.3     (1, 2)

然后您可以对该列调用 describe 进行分组:

In [455]:

df.groupby('key4').describe()
Out[455]:
                     key2  key3
key4                           
(1, 2)    count  1.000000   1.0
          mean   3.000000   0.3
          std         NaN   NaN
          min    3.000000   0.3
          25%    3.000000   0.3
          50%    3.000000   0.3
          75%    3.000000   0.3
          max    3.000000   0.3
(1, 2, 3) count  2.000000   2.0
          mean   2.500000   0.3
          std    0.707107   0.0
          min    2.000000   0.3
          25%    2.250000   0.3
          50%    2.500000   0.3
          75%    2.750000   0.3
          max    3.000000   0.3
(4, 3, 6) count  1.000000   1.0
          mean   4.000000   0.5
          std         NaN   NaN
          min    4.000000   0.5
          25%    4.000000   0.5
          50%    4.000000   0.5
          75%    4.000000   0.5
          max    4.000000   0.5