2016-08-11 58 views
1

Python Pandas : How to compile all lists in a column into one unique listPython的熊猫:如何在列的字典

返回分组名单与前一个问题的数据开始:

f = pd.DataFrame({'id':['a','b', 'a'], 'val':[['val1','val2'], 
               ['val33','val9','val6'], 
               ['val2','val6','val7']]}) 

print (df) 
    id     val 
0 a   [val1, val2] 
1 b [val33, val9, val6] 
2 a [val2, val6, val7] 

如何获取列表进入词典:

pd.Series([a for b in df.val.tolist() for a in b]).value_counts().to_dict() 
{'val1': 1, 'val2': 2, 'val33': 1, 'val6': 2, 'val7': 1, 'val9': 1} 

如何按组获得列表:

df.groupby('id')["val"].apply(lambda x: (list([a for b in x.tolist() for a in b]))

id 
a [val1, val2, val2, val6, val7] 
b    [val33, val9, val6] 
Name: val, dtype: object 

我如何通过组作为类型的字典列表:

df.groupby('id')["val"].apply(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict()) 

返回:

id  
a val1  1.0 
    val2  2.0 
    val6  1.0 
    val7  1.0 
b val33 1.0 
    val6  1.0 
    val9  1.0 
Name: val, dtype: float64 

所需的输出我俯瞰什么? :

id 
    a  {'val1': 1, 'val2': 2, 'val6': 2, 'val7': 1} 
    b  {'val33': 1, 'val6': 1, 'val9': 1} 
    Name: val, dtype: object 

回答

1

使用@ayhan的agg编辑(比应用快得多)。

from collections import Counter 
df.groupby("id")["val"].agg(lambda x: Counter([a for b in x for a in b])) 

日期:

id 
a {'val2': 2, 'val6': 1, 'val7': 1, 'val1': 1} 
b    {'val9': 1, 'val33': 1, 'val6': 1} 
Name: val, dtype: object 

时间的这个版本:

%timeit df.groupby("id")["val"].agg(lambda x: Counter([a for b in x for a in b])) 

1000 loops, best of 3: 820 µs per loop 

的@ayhan版时间:

%timeit df.groupby('id')["val"].agg(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict()) 

100 loops, best of 3: 1.91 ms per loo 
1

应用灵活。只要有可能,它会将返回的对象转换为更加可用的对象。从docs

对分组数据的某些操作可能不适合 聚合或转换类别。或者,您可能只希望GroupBy 推断如何组合结果。对于这些,可以使用apply函数 ,它可以替代许多 标准用例中的聚合和转换。

注意:apply可以充当减速器,变压器或滤波器功能, ,具体取决于传递的应用。因此取决于采取的路径 ,以及您正在分组的内容。因此,分组的列 可以被包括在输出中以及设置索引。

可能有这种情况需要避免此行为。如果您在分组时,只需更换与AGG适用于:

df.groupby('id')["val"].agg(lambda x: pd.Series([a for b in x.tolist() for a in b]).value_counts().to_dict()) 
Out: 
id 
a {'val1': 1, 'val7': 1, 'val6': 1, 'val2': 2} 
b    {'val6': 1, 'val33': 1, 'val9': 1} 
Name: val, dtype: object 
+1

请注意,我不打算速度在这里,我只是解释为何申请没有表现你所期望的方式。 – ayhan

+0

并不意味着打扰,但为什么我得到结果'dict'的bulltin-methon-values,我怎么能打印像你这样的结果? – ileadall42

+0

@Tangfeifan这似乎是一个已修复的错误https://github.com/pandas-dev/pandas/issues/16741我认为0.21版还没有发布。 – ayhan