【问题标题】:Sorting Pandas Dataframe by matching multiple rows通过匹配多行对 Pandas Dataframe 进行排序
【发布时间】:2020-12-05 20:18:38
【问题描述】:

假设我有一个这样的 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])。

【问题讨论】:

  • 如果坐标重复会怎样?
  • 我不确定这将如何工作。但是我正在处理的大多数直接数据集,坐标都是唯一的。

标签: python pandas sorting


【解决方案1】:

你可以这样做:

  • 以相同的方式对两个数组进行排序
  • 将数据框的索引设置为坐标的索引
  • 重置索引以获取原始排序:

代码

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

【讨论】:

  • 我应该说:从坐标构造数据框显然会更容易。如果这对您的问题是可能的,那将更容易/更高效
  • 是的,我同意!特别是对于我正在处理的一些数据集,可以有多达数百万行。我遇到的问题是 DataFrame 和坐标数组是由两个不同的软件生成的。我刚刚发现坐标数组按 z、x、y 升序排序。现在的问题是我不确定这是否总是正确的。
  • hm... 您最好只按 x,y,z 对 all 数据(包括 numpy)进行排序,而不是进行索引匹配。我认为这与其他回应一致
【解决方案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)

输出:

          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

【讨论】:

  • 感谢您的回答。我刚试过。它没有用。主要问题是坐标数组是随机生成的,不遵循任何模式。
  • 我用你的数组检查了它,它成功了。
  • 排序后的DataFrame的第一行匹配,但第二行不匹配:[-0.000016, -0.000016, -0.000016] vs [-1.5625e-05,1.5625e-05,-4.6875e -05]
  • 首先,根据x排序,如果x重复则根据y排序,如果y重复则根据z和(-0.000047
  • 我只是根据您上次的评论再次检查。你的答案几乎就在那里。如果将排序顺序更改为 df.sort_values(['z', 'x', 'y'], ascending=[True, True, True]),那么答案将匹配。同样,我的问题是我不能保证生成的坐标数组按照这个确切的顺序(z,x,y)进行预排序。感谢您的帮助!
猜你喜欢
  • 2018-07-03
  • 2016-09-14
  • 2022-01-21
  • 2020-10-27
  • 2020-06-23
  • 2021-08-16
  • 2016-12-01
  • 2021-06-29
  • 2014-11-29
相关资源
最近更新 更多