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

2024-04-26 13:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个看起来更像下面的pandas数据框,它包含个人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个或更多的列和大约30万个人id。你知道吗

如你所见,如果没有特征存在,我们需要用零填充它。我的方法似乎堵塞了很多记忆,我的记忆出现了错误。你知道吗

我对如何有效地实施这一点感到困惑。你知道吗


Tags: 数据方法记忆idapplepandas格式count
1条回答
网友
1楼 · 发布于 2024-04-26 13:56:04

可以将^{}^{}^{}(在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

相关问题 更多 >