Python 在无内存错误的情况下在pandas中从深格式转换为宽格式

Python 在无内存错误的情况下在pandas中从深格式转换为宽格式,python,numpy,pandas,Python,Numpy,Pandas,我有一个熊猫数据框,它看起来更像下面,包含个人Id、特征和计数。这是当前的深/长格式 Person Id Characteristics Count 123 Apple 2 123 Banana 4 124 Pineaple 1 125 Apple 2 我想有效地将其转换为一种广泛的格式,并创建一个矩阵,该矩阵需要输入到一个减少组件的算法中

我有一个熊猫数据框,它看起来更像下面,包含个人Id、特征和计数。这是当前的深/长格式

Person Id   Characteristics Count
123          Apple            2
123          Banana           4
124          Pineaple         1
125          Apple            2
我想有效地将其转换为一种广泛的格式,并创建一个矩阵,该矩阵需要输入到一个减少组件的算法中

它应该像下面这样

Person Id   Apple   Banana  Pineapple
123           2       4        0
124           0       0        1
125           2       0        0
我正在寻找一种有效的方法来做到这一点。目前大约有2000多个特征,因此将有大约2000个或更多列和大约300K个人ID

正如你所看到的,如果没有特征存在,我们需要用零填充它。我的方法似乎堵塞了很多内存,我的内存出现了错误

我对如何有效地实现这一点感到困惑。

您可以与and一起使用(pandas
0.18.0
中新增),但旋转需要大量内存:

print df.pivot_table(index='Person Id', 
                     columns='Characteristics', 
                     values='Count', 
                     fill_value=0).reset_index().rename_axis(None, axis=1)

   Person Id  Apple  Banana  Pineaple
0        123      2       4         0
1        124      0       0         1
2        125      2       0         0
也许更快的是:

print df.pivot(index='Person Id', 
               columns='Characteristics', 
               values='Count').fillna(0).reset_index().rename_axis(None, axis=1)

   Person Id  Apple  Banana  Pineaple
0        123    2.0     4.0       0.0
1        124    0.0     0.0       1.0
2        125    2.0     0.0       0.0
计时

In [69]: %timeit df.pivot_table(index='Person Id',  columns='Characteristics',  values='Count',  fill_value=0).reset_index().rename_axis(None, axis=1)
100 loops, best of 3: 5.26 ms per loop

In [70]: %timeit df.pivot(index='Person Id',  columns='Characteristics',  values='Count').fillna(0).reset_index().rename_axis(None, axis=1)
1000 loops, best of 3: 1.87 ms per loop

你的方法是什么?谢谢。但人员Id可能会重复,这会导致
ValueError:索引包含重复的条目,无法重塑
您认为
透视中的错误吗?我认为pivot\u table
可以工作。这两个函数之间的区别已经解释了。