Предположим, у меня есть DataFrame, как это:

data=np.array([[-1.5625e-05,-1.5625e-05,-4.6875e-05],
[-1.5625e-05,-1.5625e-05,-1.5625e-05],
[-1.5625e-05,1.5625e-05,-4.6875e-05],
[-1.5625e-05,1.5625e-05,-1.5625e-05],
[1.5625e-05,-1.5625e-05,-4.6875e-05],
[1.5625e-05,-1.5625e-05,-1.5625e-05],
[1.5625e-05,1.5625e-05,-4.6875e-05],
[1.5625e-05,1.5625e-05,-1.5625e-05]])

df=pd.DataFrame(data=data,columns=['x','y','z'])

И массив numpy

coord=np.array([[-1.5625e-05,-1.5625e-05,-4.6875e-05],
[-1.5625e-05,1.5625e-05,-4.6875e-05],
[1.5625e-05,-1.5625e-05,-4.6875e-05],
[1.5625e-05,1.5625e-05,-4.6875e-05],
[-1.5625e-05,-1.5625e-05,-1.5625e-05],
[-1.5625e-05,1.5625e-05,-1.5625e-05],
[1.5625e-05,-1.5625e-05,-1.5625e-05],
[1.5625e-05,1.5625e-05,-1.5625e-05]])

Количество строк в фрейме данных Pandas и массиве координат всегда одинаково. Как видите, строки между фреймом данных Pandas и координатами такие же, но в другом порядке. Я хотел бы отсортировать DataFrame в соответствии с порядком в массиве координат (например, df.x == координаты [:, 0] & df.y == координаты [:, 1] & df.z == координаты [:, 2]).

1
tn22288 5 Дек 2020 в 23:18

2 ответа

Лучший ответ

Вы могли бы сделать это так:

  • отсортируйте оба массива одинаково
  • установить индекс фрейма данных в координаты
  • сбросить индекс, чтобы получить исходный порядок:

Код

df2 = pd.DataFrame(coord, columns=list("xyz"))
sort_cols = list("yxz")
df = df.sort_values(sort_cols)
df2 = df2.sort_values(sort_cols)
df.index = df2.index
df = df.sort_index()

Это должно вернуть df, отсортированный как координаты (вывод):

          x         y         z
0 -0.000016 -0.000016 -0.000047
1 -0.000016  0.000016 -0.000047
2  0.000016 -0.000016 -0.000047
3  0.000016  0.000016 -0.000047
4 -0.000016 -0.000016 -0.000016
5 -0.000016  0.000016 -0.000016
6  0.000016 -0.000016 -0.000016
7  0.000016  0.000016 -0.000016
0
anon01 5 Дек 2020 в 20:38

Вы можете выполнить необходимую сортировку по:

df.sort_values(['x', 'y', 'z'], ascending=[True, True, True])

Полный код:

import numpy as np
import pandas as pd

data=np.array([[-1.5625e-05,-1.5625e-05,-4.6875e-05],
[-1.5625e-05,-1.5625e-05,-1.5625e-05],
[-1.5625e-05,1.5625e-05,-4.6875e-05],
[-1.5625e-05,1.5625e-05,-1.5625e-05],
[1.5625e-05,-1.5625e-05,-4.6875e-05],
[1.5625e-05,-1.5625e-05,-1.5625e-05],
[1.5625e-05,1.5625e-05,-4.6875e-05],
[1.5625e-05,1.5625e-05,-1.5625e-05]])

df= pd.DataFrame(data=data,columns=['x','y','z'])

df.sort_values(['x', 'y', 'z'], ascending=[True, True, True])

print(df)

Выход:

          x         y         z
0 -0.000016 -0.000016 -0.000047
1 -0.000016 -0.000016 -0.000016
2 -0.000016  0.000016 -0.000047
3 -0.000016  0.000016 -0.000016
4  0.000016 -0.000016 -0.000047
5  0.000016 -0.000016 -0.000016
6  0.000016  0.000016 -0.000047
7  0.000016  0.000016 -0.000016
0
Nour-Allah Hussein 5 Дек 2020 в 20:36