【问题标题】:How to move data in numpy array from column/row to another based on value in third column如何根据第三列中的值将numpy数组中的数据从列/行移动到另一个
【发布时间】:2016-03-03 13:25:37
【问题描述】:

我正在尝试对这些数据进行排序以从中获取:

对此:

基本上,我正在尝试将 5 行数据(每行具有 1 个 ID 和 2 个值)压缩为 1 行具有 1 个 ID 和 10 个值的数据。我的数据大约是。 600 万行长。需要注意的一点:并非每个组都有 5 个(X,Y)坐标值。有些只有 4 个。

我无法弄清楚如何仅通过索引来做到这一点。所以我写了一个 for 循环,它不能很好地工作。它将对前 10,000 个 ok 进行排序(但以错误结束),但它需要永远。

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

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

非常感谢

【问题讨论】:

    标签: python numpy pandas reshape


    【解决方案1】:

    假设

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

    暗示您正在使用 Pandas,那么产生所需结果的最简单方法是使用 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  
    

    【讨论】:

    • 这太完美了!非常感谢
    猜你喜欢
    • 2020-01-16
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多