繁体   English   中英

通过匹配多行排序 Pandas Dataframe

[英]Sorting Pandas Dataframe by matching multiple rows

假设我有一个像这样的 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 Dataframe 和坐标数组中的行数始终相同。 如您所见,Pandas DataFrame 和坐标之间的行相同,但顺序不同。 我想根据坐标数组的顺序对 DataFrame 进行排序(例如 df.x==coord[:,0] & df.y==coord[:,1] & df.z==coord[:, 2])。

您可以通过以下方式进行所需的排序:

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)

output:

          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

你可以这样做:

  • 以相同的方式对 arrays 进行排序
  • 将 dataframe 的索引设置为坐标的索引
  • 重置索引以获取原始排序:

代码

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM