如何将一列拆分成多列并计算频率

时间:2015-11-08 16:31:51

标签: pandas dataframe

给出一个表

,这是我想到的问题
   Id   type
0   1    [a,b]
1   2     [c]
2   3     [a,d]

我想将其转换为以下形式:

   Id     a  b  c  d
0   1     1  1  0  0
1   2     0  0  1  0
2   3     1  0  0  1

我需要一种非常有效的方法来转换大表。任何评论都是受欢迎的。

====================================

我收到了好几个答案,非常感谢你的帮助。

现在出现了一个新问题,即我的笔记本电脑内存不足以使用pd.dummies生成整个数据帧。

无论如何都要逐行生成稀疏向量,然后堆叠在一起?

2 个答案:

答案 0 :(得分:1)

试试这个:

pd.get_dummies(df.type.apply(lambda x: pd.Series([i for i in x])))

解释:

df.type.apply(lambda x: pd.Series([i for i in x]

为您提供列表中索引位置的列。然后,您可以使用get dummies来获取每个值的计数

pd.get_dummies(df.type.apply(lambda x: pd.Series([i for i in x])))

输出:

    a   c   b   d
0   1   0   1   0
1   0   1   0   0
2   1   0   0   1

答案 1 :(得分:1)

试试这个

>>> df
   Id    type
0   1  [a, b]
1   2     [c]
2   3  [a, d]
>>> df2 = pd.DataFrame([x for x in df['type'].apply(
...           lambda item: dict(map(
...                                 lambda x: (x,1), 
...                             item)) 
...           ).values]).fillna(0)
>>> df2.join(df)
   a  b  c  d  Id    type
0  1  1  0  0   1  [a, b]
1  0  0  1  0   2     [c]
2  1  0  0  1   3  [a, d]

它基本上将列表列表转换为dict列表,并从此

构造一个DataFrame
  

[['a','b'],['c'],['a','d']]#清单列表
  [{'a':1,'b':1},{'c':1},{'a':1,'d':1}] #dict of dict   从这个

中创建DataFrame