Сортировка по абсолютному значению для значения, отличного от нуля, для одного столбца с сохранением равного значения другого столбца вместе - PullRequest
1 голос
/ 03 августа 2020

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

A    B    C   
============
11   x    2 
11   y    0
13   x  -10 
13   y    0
10   x    7
10   y    0

, и я хотел бы отсортировать C по абсолютному значению для значения, отличного от 0. Но поскольку мне нужно сохранить значения A вместе, это будет выглядеть, как показано ниже (отсортировано по абсолютному значению, но с 0 между ними):

A    B    C   
============
13   x  -10 
13   y    0
10   x    7 
10   y    0
11   x    2
11   y    0

Я не могу получить это с помощью sort_values(). Если я отсортирую по C, у меня не будет значений A.

Ответы [ 2 ]

1 голос
/ 08 августа 2020

Шаг 1: получить абсолютные значения

# creating a column with the absolute values
df["abs_c"] = df["c"].abs() 

Шаг 2: отсортировать значения по абсолютным значениям «c»

# sorting by absolute value of "c" & reseting the index & assigning it back to df
df = df.sort_values("abs_c",ascending=False).reset_index(drop=True)

Шаг 3: получить порядок столбцов a "на основе отсортированных значений, это достигается за счет использования дубликатов отбрасывания pandas, который сохраняет первый экземпляр значения в столбце a, который отсортирован на основе« c ». Это будет использоваться на следующем шаге.

# getting the order of "a" based on sorted value of "c"
order_a = df["a"].drop_duplicates()

Шаг 4: на основе порядка «a» и отсортированных значений «c» создание фрейма данных

# based on the order_a creating a data frame as per the order_a which is based on the sorted values of abs "c"
sorted_df = pd.DataFrame()

for i in range(len(order_a)):
  sorted_df = sorted_df.append(df[df["a"]==order_a[i]])

Шаг 5: присвоение отсортированного df обратно df

# reset index of sorted values and assigning it back to df
df = sorted_df.reset_index(drop=True)

Output

     a  b   c  abs_c
0   13  x  -10  10
1   13  y   0   0
2   10  x   7   7
3   10  y   0   0
4   11  x   2   2
5   11  y   0   0

Do c reference https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html

1 голос
/ 03 августа 2020

Извините, получается не очень красиво, но пандами почти не пользуюсь. Надеюсь, все получится так, как вы хотите.

import pandas as pd

df = pd.DataFrame({'a': [11, 11, 13, 13, 10, 10],
                   'b': ['x', 'y', 'x', 'y', 'x', 'y'],
                   'c': [2, 0, -10, 0, 7, 0]})
mask = df[df['c'] != 0]
mask['abs'] = mask['c'].abs()
mask = mask.sort_values('abs', ascending=False).reset_index()
tempNr = 0
for index, row in df.iterrows():
    if row['c'] != 0:
        df.loc[index] = mask.loc[tempNr].drop('abs')
        tempNr = tempNr + 1
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...