Pandas сортировка значения столбца без сортировки даты и времени соответственно - PullRequest
1 голос
/ 12 марта 2020

У меня есть следующий фрейм данных:

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

РЕДАКТИРОВАТЬ:

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 отсортированы от высокого к низкому, а затем для name = 2 все значения X отсортированы от высокого к низкому .

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Первая идея - переназначить столбец 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()

РЕДАКТИРОВАТЬ Используйте 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
0 голосов
/ 16 марта 2020

Я решил это:

df = df.groupby(['name'],group_keys=False).apply(lambda _df: _df.sort_values(by=['X'], ascending=True)).assign(Date = df['Date'].to_numpy())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...