Pandas数据框数组列中的Groupby值
我有一个包含几列数组的数据框。以下是其中一列的示例:
key arraylist
0 PROJECT-13051 [value1, value2, value4]
1 PROJECT-13050 [value2, value3, value4]
2 PROJECT-13049 [value1, value2, value3]
3 PROJECT-13048 [value3, value4, value5]
4 PROJECT-13047 [value1, value2, value5]
我从 sql 数据库中以逗号分隔的形式提取此数据,然后使用以下内容设置为列表:
df[arraylist] = df[arraylist].apply(literal_eval)
我想按arraylist列分组并获取数组中每个值的大小:
df.groupby('arraylist').size()
这导致错误TypeError: unhashable type: 'list'
我想得到这样的输出:
arraylist
value1 3
value2 4
value3 3
value4 3
value5 2
dtype: int64
任何帮助将不胜感激!
回答
尝试explode+ value_counts:
df['arraylist'].explode().value_counts()
value2 4
value1 3
value4 3
value3 3
value5 2
Name: arraylist, dtype: int64
可选sort_index用于在 OP 中排序:
df['arraylist'].explode().value_counts().sort_index()
value1 3
value2 4
value3 3
value4 3
value5 2
Name: arraylist, dtype: int64
value1 3
value2 4
value3 3
value4 3
value5 2
Name: arraylist, dtype: int64
或者使用natsorted正确的自然字母数字排序:
from natsort import natsorted
df['arraylist'].explode().value_counts().loc[lambda s: natsorted(s.index)]
使用的数据帧和导入:
from ast import literal_eval
import pandas as pd
df = pd.DataFrame({
'key': ['PROJECT-13051', 'PROJECT-13050', 'PROJECT-13049',
'PROJECT-13048', 'PROJECT-13047'],
'arraylist': ['["value1", "value2", "value4"]',
'["value2", "value3", "value4"]',
'["value1", "value2", "value3"]',
'["value3", "value14", "value5"]',
'["value1", "value2", "value5"]']
})
df['arraylist'] = df['arraylist'].apply(literal_eval)