Python 在无内存错误的情况下在pandas中从深格式转换为宽格式
我有一个熊猫数据框,它看起来更像下面,包含个人Id、特征和计数。这是当前的深/长格式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 我想有效地将其转换为一种广泛的格式,并创建一个矩阵,该矩阵需要输入到一个减少组件的算法中
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一起使用(pandas0.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
可以工作。这两个函数之间的区别已经解释了。