熊猫对列值进行排序而不对日期时间进行相应排序

时间:2020-03-12 11:24:22

标签: 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 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值从高到低排序。

2 个答案:

答案 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())