2016-03-03 22 views
0

我试着去这个数据进行排序,从这个去:如何在numpy的阵列从列移动数据/行到另一台基于在第三列值

enter image description here

这样: enter image description here

基本上,我试图压缩5行数据,每个数据有1个ID和2个值,分成1行数据和1个ID和10个值。我的数据是约。长达600万行。有一件事要注意:并非每个组都有5(X,Y)坐标值。一些只有4.

我无法弄清楚如何通过索引单独做到这一点。所以我写了一个for循环,这并不很好。它会排序第一个10,000确定(但以错误结束),但它需要永远。

coords = pd.read_csv('IDQQCoords.csv') 

coords = coords.as_matrix(columns=None) 

mpty = np.zeros((len(coords),8),dtype=float) 
#creates an empty array the same length as coords 

coords = np.append(coords,mpty,axis=1) 
# adds the 8 empty columns from the previous command 
#This is to make space to add the values from subsequent rows 



cnt = 0 
lth = coords.shape[0] 
for counter in range(1,lth): 

    if coords[cnt+1,0] == coords[cnt,0]: 
     coords[cnt,3:5] = coords[cnt+1,1:3]   
     coords = np.delete(coords,cnt+1,axis=0) 

    if coords[cnt+1,0] == coords[cnt,0]: 
     coords[cnt,5:7] = coords[cnt+1,1:3]  
     coords = np.delete(coords,cnt+1,axis=0) 

    if coords[cnt+1,0] == coords[cnt,0]: 
     coords[cnt,7:9] = coords[cnt+1,1:3] 
     coords = np.delete(coords,cnt+1,axis=0) 

    if coords[cnt+1,0] == coords[cnt,0]: 
     coords[cnt,9:11] = coords[cnt+1,1:3]   
     coords = np.delete(coords,cnt+1,axis=0) 

    cnt = cnt+1 

有人可以帮助我,无论是与索引或更好的循环?

由于一吨

回答

0

假设

coords = pd.read_csv('IDQQCoords.csv') 

意味着使用的是熊猫,则最简单的方法,以产生所期望的结果是使用DataFrame.pivot

import pandas as pd 
import numpy as np 
np.random.seed(2016) 

df = pd.DataFrame({'shapeid': [0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2], 
       'x': np.random.random(14), 
       'y': np.random.random(14)}) 
#  shapeid   x   y 
# 0   0 0.896705 0.603638 
# 1   0 0.730239 0.588791 
# 2   0 0.783276 0.069347 
# 3   0 0.741652 0.942829 
# 4   0 0.462090 0.372599 
# 5   1 0.642565 0.451989 
# 6   1 0.224864 0.450841 
# 7   1 0.708547 0.033112 
# 8   1 0.747126 0.169423 
# 9   2 0.625107 0.180155 
# 10  2 0.579956 0.352746 
# 11  2 0.242640 0.342806 
# 12  2 0.131956 0.277638 
# 13  2 0.143948 0.375779 

df['col'] = df.groupby('shapeid').cumcount() 
df = df.pivot(index='shapeid', columns='col') 
df = df.sort_index(axis=1, level=1) 
df.columns = ['{}{}'.format(col, num) for col,num in df.columns] 
print(df) 

收率

   x0  y0  x1  y1  x2  y2  x3 \ 
shapeid                   
0  0.896705 0.603638 0.730239 0.588791 0.783276 0.069347 0.741652 
1  0.642565 0.451989 0.224864 0.450841 0.708547 0.033112 0.747126 
2  0.625107 0.180155 0.579956 0.352746 0.242640 0.342806 0.131956 

       y3  x4  y4 
shapeid         
0  0.942829 0.462090 0.372599 
1  0.169423  NaN  NaN 
2  0.277638 0.143948 0.375779 
+0

这是完美的!万分感谢 – joswhite

相关问题