Пользовательская сортировка в Python Python DataFrame требует лучшего подхода - PullRequest
0 голосов
/ 10 июня 2018

У меня есть такой фрейм данных

user = pd.DataFrame({'User':['101','101','101','102','102','101','101','102','102','102'],'Country':['India','Japan','India','Brazil','Japan','UK','Austria','Japan','Singapore','UK']})

Я хочу применить пользовательскую сортировку в стране, и Япония должна быть на вершине для обоих пользователей

Я сделал это, но этоне мой ожидаемый результат

user.sort_values(['User','Country'], ascending=[True, False], inplace=True)

мой ожидаемый результат

expected_output = pd.DataFrame({'User':['101','101','101','101','101','102','102','102','102','102'],'Country':['Japan','India','India','UK','Austria','Japan','Japan','Brazil','Singapore','UK']})

Я попытался привести столбец к категории и при прохождении категорий и поставить Японию на вершину.Есть ли какой-то другой подход, я не хочу каждый раз проходить список всех стран.я просто хочу дать пользователю 101 -japan или пользователю 102- UK, тогда должен прийти порядок оставшихся строк.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Создание новой ключевой справочной сортировки с использованием map

user.assign(New=user.Country.map({'Japan':1}).fillna(0)).sort_values(['User','New'], ascending=[True, False]).drop('New',1)
Out[80]: 
     Country User
1      Japan  101
0      India  101
2      India  101
5         UK  101
6    Austria  101
4      Japan  102
7      Japan  102
3     Brazil  102
8  Singapore  102
9         UK  102

Обновление базы для комментариев

mapdf=pd.DataFrame({'Country':['Japan','UK'],'User':['101','102'],'New':[1,1]})
user.merge(mapdf,how='left').fillna(0).sort_values(['User','New'], ascending=[True, False]).drop('New',1)
Out[106]: 
     Country User
1      Japan  101
0      India  101
2      India  101
5         UK  101
6    Austria  101
9         UK  102
3     Brazil  102
4      Japan  102
7      Japan  102
8  Singapore  102
0 голосов
/ 10 июня 2018

Использование boolean indexing с append, последняя сортировка по столбцу User:

user = (user[user['Country'] == 'Japan']
        .append(user[user['Country'] != 'Japan'])
        .sort_values('User'))

Альтернативное решение:

user = (user.query('Country == "Japan"')
            .append(user.query('Country != "Japan"'))
            .sort_values('User'))

print (user)
  User    Country count
1  101      Japan     1
0  101      India     2
2  101      India     3
5  101         UK     1
6  101    Austria     1
4  102      Japan     1
7  102      Japan     1
3  102     Brazil     2
8  102  Singapore     1
9  102         UK     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...