如何根据第三列中的值将 numpy 数组中的数据从 column/row 移动到另一个
How to move data in numpy array from column/row to another based on value in third column
我正在尝试对这些数据进行排序:
对此:
基本上,我试图将 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
有人可以用索引或更好的循环帮助我吗?
非常感谢
假设
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
我正在尝试对这些数据进行排序:
对此:
基本上,我试图将 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
有人可以用索引或更好的循环帮助我吗?
非常感谢
假设
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