2015-11-08 58 views
0

这里是我心目中的问题,给定一个表如何分割一列到多列和计算频率

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生成整个数据帧。

有无论如何生成一个行和堆栈然后在一起的稀疏矢量?

+0

您是否知道'''事先可能发生的所有可能的值? – shanmuga

+0

@shanmuga,是的,我可以事先快速计算所有不同的类型 –

+0

您的'type'列是由字符串还是字符串列表组成? – DSM

回答

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] 

它基本上列表的列表转换为字典的名单和构建一个DataFrame out of this

[ ['a', 'b'], ['c'], ['a', 'd'] ] # list of list
[ {'a':1, 'b':1}, {'c':1}, {'a':1, 'd':1} ] # list of dict Make DataFrame out of this

+0

@ 3c。您的数据有多大?有多少行和不同值对于类型?我测试它有100万行和4个不同的值,它在4-6秒内完成。 – shanmuga

+0

40,000行,约7000列。这张表不应该很大,但是当我使用'pd.get_dummies' –

+0

@ 3c时,我的4G内存笔记本电脑的内存不足。 4GB应该足以处理这个问题。如果你遇到内存错误,你的代码需要更多的优化。 – shanmuga

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 
+0

这真的很简洁,很好。非常感谢。唯一的问题是我的电脑内存不足。也许我可以切换到16GB内存的桌面,或者我可以将虚拟矩阵存储为稀疏形式吗? –

+0

如果它是一个字符串,而不是一个列表,那么你可以使用字符串方法'split()'。我已将它添加到答案中(您可能需要先处理方括号 – JAB

+1

@JAB,您可以通过将代码修改为'df.type.apply(lambda x:pd.Series([1] * len (x),index = x))' – shanmuga