Я пытаюсь отсортировать следующие панды DataFrame:

         RHS  age  height  shoe_size  weight
0     weight  NaN     0.0        0.0     1.0
1  shoe_size  NaN     0.0        1.0     NaN
2  shoe_size  3.0     0.0        0.0     NaN
3     weight  3.0     0.0        0.0     1.0
4        age  3.0     0.0        0.0     1.0

Таким образом, что строки с большим числом столбцов NaNs располагаются первыми. Точнее, в приведенном выше df строка с индексом 1 (2 Nans) должна предшествовать строке с индексом 0 (1 NaN).

Что я делаю сейчас:

df.sort_values(by=['age', 'height', 'shoe_size', 'weight'], na_position="first")
3
Juan Carlos 28 Авг 2017 в 01:10

4 ответа

Лучший ответ

Использование доступа df.sort_values и loc.

df = df.iloc[df.isnull().sum(1).sort_values(ascending=0).index]
print(df)

         RHS  age  height  shoe_size  weight
1  shoe_size  NaN     0.0        1.0     NaN
2  shoe_size  3.0     0.0        0.0     NaN
0     weight  NaN     0.0        0.0     1.0
4        age  3.0     0.0        0.0     1.0
3     weight  3.0     0.0        0.0     1.0

df.isnull().sum(1) считает NaN с, и строки доступны на основе этого отсортированного количества.


@ayhan предложил приятное небольшое улучшение вышеупомянутого решения, включающее pd.Series.argsort:

df = df.iloc[df.isnull().sum(axis=1).mul(-1).argsort()]
print(df)

         RHS  age  height  shoe_size  weight 
1  shoe_size  NaN     0.0        1.0     NaN           
0     weight  NaN     0.0        0.0     1.0           
2  shoe_size  3.0     0.0        0.0     NaN           
3     weight  3.0     0.0        0.0     1.0           
4        age  3.0     0.0        0.0     1.0            
11
cs95 27 Авг 2017 в 22:43

Вот одна строка, которая сделает это:

df.assign(Count_NA = lambda x: x.isnull().sum(axis=1)).sort_values('Count_NA', ascending=False).drop('Count_NA', axis=1)
#          RHS  age  height  shoe_size  weight
# 1  shoe_size  NaN     0.0        1.0     NaN
# 0     weight  NaN     0.0        0.0     1.0
# 2  shoe_size  3.0     0.0        0.0     NaN
# 3     weight  3.0     0.0        0.0     1.0
# 4        age  3.0     0.0        0.0     1.0

Это работает путем назначения временного столбца («Count_NA») для подсчета NA в каждой строке, сортировки по этому столбцу и последующего удаления его в одном и том же выражении.

2
cmaher 27 Авг 2017 в 22:18

Вы можете добавить столбец с числом нулевых значений, отсортировать по этому столбцу, а затем удалить столбец. Вам решать, хотите ли вы использовать .reset_index(drop=True) для сброса счетчика строк.

df['null_count'] = df.isnull().sum(axis=1)
df.sort_values('null_count', ascending=False).drop('null_count', axis=1)

# returns
         RHS  age  height  shoe_size  weight
1  shoe_size  NaN     0.0        1.0     NaN
0     weight  NaN     0.0        0.0     1.0
2  shoe_size  3.0     0.0        0.0     NaN
3     weight  3.0     0.0        0.0     1.0
4        age  3.0     0.0        0.0     1.0
2
James 27 Авг 2017 в 22:20

Df.isnull ( ) . Сумма ( ) . sort_values ( восходящая = False)

0
Zainab Ali 29 Мар 2019 в 09:47