【问题标题】:Sorting data but keeping particular rows together对数据进行排序但将特定行保持在一起
【发布时间】:2019-11-17 15:54:57
【问题描述】:

以下列表只是我创建的一个示例。我有一个更长的列表,第一列是汽车序列号​​,第二列是日期。在后面的列中有很多数据。一辆车(序列号)总是有三个报告,它们应该保持在一起。但日期总是在变化。所以一天“car_01”有最新的条目,而另一天“car_24”有最新的条目。带有汽车序列号​​的最新条目应位于顶部。然后按照序列号的另外两个报告。第四个应该是第二个最新的报告,两个报告都在第二个序列号之后。

    Cars    date
0   Car_01  2019-01-22
1   Car_01  2019-05-23
2   Car_01  2019-06-17
3   Car_02  2019-02-15
4   Car_02  2019-06-17
5   Car_02  2019-09-18
6   Car_03  2019-02-27
7   Car_03  2019-10-19
8   Car_03  2019-11-22
9   Car_04  2019-04-12
10  Car_04  2019-11-17
11  Car_04  2019-01-16

有没有办法创建组然后按日期排序?

vs = vs.sort_values(by=['date'], ascending=False)

如果我这样排序,汽车就会混在一起。

    Cars    date
8   Car_03  2019-11-22
10  Car_04  2019-11-17
7   Car_03  2019-10-19
5   Car_02  2019-09-18
2   Car_01  2019-06-17
4   Car_02  2019-06-17
1   Car_01  2019-05-23
9   Car_04  2019-04-12
6   Car_03  2019-02-27
3   Car_02  2019-02-15
0   Car_01  2019-01-22
11  Car_04  2019-01-16

如果排序正确,输出应该是这样的。

    Cars    date
0   Car_03  2019-11-22
1   Car_03  2019-10-19
2   Car_03  2019-02-27
3   Car_04  2019-11-17
4   Car_04  2019-04-12
5   Car_04  2019-01-16
6   Car_02  2019-09-18
7   Car_02  2019-06-17
8   Car_02  2019-02-15
9   Car_01  2019-06-17
10  Car_01  2019-05-23
11  Car_01  2019-01-22

【问题讨论】:

  • 您应该添加原始数据而不是图像或屏幕截图
  • vs.sort_values(by=['Cars', 'date'], ascending=False)
  • @FlorianH 在这种情况下,最新日期不会留在最前面。
  • @jezrael 这也不能解决我的问题。哪辆车在上面并不重要,他们应该成群结队地呆在一起。重要的部分是日期。
  • 你能在问题中添加预期的输出吗?

标签: python excel pandas numpy sorting


【解决方案1】:

您可以使用GroupBy.transformmax 创建帮助列,按此列排序并最后删除它:

vs['new'] = vs.groupby('Cars')['date'].transform('max')
print (vs)
      Cars        date         new
0   Car_01  2019-05-22  2019-07-23
1   Car_01  2019-07-23  2019-07-23
2   Car_01  2019-01-25  2019-07-23
3   Car_02  2019-08-24  2019-08-24
4   Car_02  2019-04-14  2019-08-24
5   Car_02  2019-03-27  2019-08-24
6   Car_03  2019-02-25  2019-12-16
7   Car_03  2019-05-17  2019-12-16
8   Car_03  2019-12-16  2019-12-16
9   Car_04  2019-09-28  2019-11-19
10  Car_04  2019-03-17  2019-11-19
11  Car_04  2019-11-19  2019-11-19

vs = vs.sort_values(by=['new', 'Cars','date'], ascending=False).drop('new', axis=1)
print (vs)
      Cars        date
8   Car_03  2019-12-16
7   Car_03  2019-05-17
6   Car_03  2019-02-25
11  Car_04  2019-11-19
9   Car_04  2019-09-28
10  Car_04  2019-03-17
3   Car_02  2019-08-24
4   Car_02  2019-04-14
5   Car_02  2019-03-27
1   Car_01  2019-07-23
0   Car_01  2019-05-22
2   Car_01  2019-01-25

【讨论】:

  • 抱歉没有解决。编辑了我的问题。希望现在可以理解了。
  • @Kuempsmichi - 嗯,然后不明白。对不起,可以解释更多吗?
  • @Kuempsmichi - 我很困惑,我的解决方案运行良好。
  • @jezrael 现在可以了。非常感谢;)对我帮助很大。
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多