我有以下数据框:
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列的值从最大到最小排序,而不移动Date的顺序。我不想为我的日期建立索引,最好不要为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
编辑:
df = pd.DataFrame({})
df['Date'] = pd.to_datetime(np.arange(0,6), unit='h', origin='2018-08-03:00:00')
df['X'] = [3,5,4,1,8,2]
df['Y'] = [6,7,8,6,7,8]
df['name'] = [1,1,1,2,2,2]
我想按上面的顺序排序,但是现在我想按列级别“名称”进行分组。结果应如下所示:
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值从高到低排序。
答案 0 :(得分:1)
第一个想法是,在使用删除的Date
参数进行排序后,重新分配列inplce=True
:
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()
EDIT两列同时使用DataFrame.sort_values
而不是一个:
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
答案 1 :(得分:0)
我通过以下方式解决了该问题:
df = df.groupby(['name'],group_keys=False).apply(lambda _df: _df.sort_values(by=['X'], ascending=True)).assign(Date = df['Date'].to_numpy())