Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 对列值进行排序,而不相应地对日期时间进行排序_Pandas_Sorting - Fatal编程技术网

Pandas 对列值进行排序,而不相应地对日期时间进行排序

Pandas 对列值进行排序,而不相应地对日期时间进行排序,pandas,sorting,Pandas,Sorting,我有以下数据帧: df = pd.DataFrame({}) df['Date'] = pd.to_datetime(np.arange(0,3), unit='h', origin='2018-08-01 03:00:00') df['X'] = [3,5,4] df['Y'] = [6,7,8] Date X Y 0 2018-08-01 03:00:00 3 6 1 2018-08-01 04:00:00 5 7 2 2018-08-01

我有以下数据帧:

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,3), unit='h', origin='2018-08-01 03:00:00')
df['X'] = [3,5,4]
df['Y'] = [6,7,8]

                 Date  X  Y
0 2018-08-01 03:00:00  3  6
1 2018-08-01 04:00:00  5  7
2 2018-08-01 05:00:00  4  8
我想将X列的值从最大值排序到最小值,而不移动日期的顺序。我不想为我的日期编制索引,最好我不想复制我在X排序后合并的数据帧。结果应该如下所示:

                 Date  X  Y
0 2018-08-01 03:00:00  5  7
1 2018-08-01 04:00:00  4  8
2 2018-08-01 05:00:00  3  6
                 Date  X  Y name 
1 2018-08-01 04:00:00  5  7 1
2 2018-08-01 05:00:00  4  8 1
0 2018-08-01 03:00:00  3  6 1
4 2018-08-01 07:00:00  8  7 2
5 2018-08-01 08:00:00  2  8 2
3 2018-08-01 06:00:00  1  6 2
编辑:

我想像上面那样排序,但现在我想按列级别“name”分组。结果应该如下所示:

                 Date  X  Y
0 2018-08-01 03:00:00  5  7
1 2018-08-01 04:00:00  4  8
2 2018-08-01 05:00:00  3  6
                 Date  X  Y name 
1 2018-08-01 04:00:00  5  7 1
2 2018-08-01 05:00:00  4  8 1
0 2018-08-01 03:00:00  3  6 1
4 2018-08-01 07:00:00  8  7 2
5 2018-08-01 08:00:00  2  8 2
3 2018-08-01 06:00:00  1  6 2

因此,对于名字=1,所有X值都从高到低排序,然后对于名字=2,所有X值都从高到低排序。

第一个想法是在使用删除的
inplce=True
参数进行排序后重新命名列
Date

df = df.sort_values(by=['X'], ascending=False).assign(Date = df['Date'].to_numpy())
print (df)

                 Date  X  Y
1 2018-08-01 03:00:00  5  7
2 2018-08-01 04:00:00  4  8
0 2018-08-01 05:00:00  3  6
或者,您可以重新指定转换为numpy数组的已排序列:

df[['X','Y']] = df.sort_values(by=['X'], ascending=False)[['X','Y']].to_numpy()
编辑“由两列使用”,而不是仅由一列使用:

df1 = (df.sort_values(['name','X'], ascending=[True, False])
         .assign(Date = df['Date'].to_numpy()))
print (df1)
                 Date  X  Y  name
1 2018-08-01 03:00:00  5  7     1
2 2018-08-01 04:00:00  4  8     1
0 2018-08-01 05:00:00  3  6     1
4 2018-08-01 06:00:00  8  7     2
5 2018-08-01 07:00:00  2  8     2
3 2018-08-01 08:00:00  1  6     2
我通过以下方式解决了这个问题:

df = df.groupby(['name'],group_keys=False).apply(lambda _df: _df.sort_values(by=['X'], ascending=True)).assign(Date = df['Date'].to_numpy())

对解决方案还感兴趣吗?不,我不再感兴趣了。我得到了我想要的解决方案。谢谢你的帮助我知道有一些评论,但我是离线的,所以忘记获取响应你的答案应该是
df1=df.groupby(['name'],group\u keys=False)。apply(lambda\u df:_df.sort\u values(by=['X'],升序=False))。assign(Date=df['Date'])。to\u numpy()
,我的答案被编辑了。