Как отсортировать каждую строку кадра данных pandas и вернуть индекс столбца на основе отсортированных значений строки - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь отсортировать каждую строку pandas dataframe и получить индекс отсортированных значений в новом dataframe.Я мог бы сделать это медленно.Может кто-нибудь предложить улучшения с использованием распараллеливания или векторизованного кода для этого.Я разместил пример ниже.

data_url = 'https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv'

# read data from url as pandas dataframe
gapminder = pd.read_csv(data_url)

# drop categorical column
gapminder.drop(['country', 'continent'], axis=1, inplace=True) 

# print the first three rows
print(gapminder.head(n=3))

   year         pop  lifeExp   gdpPercap
0  1952   8425333.0   28.801  779.445314
1  1957   9240934.0   30.332  820.853030
2  1962  10267083.0   31.997  853.100710

В результате я ищу это

tag_0   tag_1   tag_2   tag_3
0   pop year    gdpPercap   lifeExp
1   pop year    gdpPercap   lifeExp
2   pop year    gdpPercap   lifeExp

В этом случае, так какpop всегда выше, чем gdpPercap и lifeExp, оно всегда идет первым.

Я мог бы добиться требуемого результата, используя следующий код.Но вычисление занимает больше времени, если df имеет много строк / столбцов.

Может кто-нибудь предложить улучшение по этому

def sort_df(df):
    sorted_tags = pd.DataFrame(index = df.index, columns = ['tag_{}'.format(i) for i in range(df.shape[1])])
    for i in range(df.shape[0]):
        sorted_tags.iloc[i,:] = list( df.iloc[i, :].sort_values(ascending=False).index)
    return sorted_tags

sort_df(gapminder)

1 Ответ

0 голосов
/ 29 ноября 2018

Вероятно, это так же быстро, как и с numpy:

def sort_df(df):
    return pd.DataFrame(
        data=df.columns.values[np.argsort(-df.values, axis=1)],
        columns=['tag_{}'.format(i) for i in range(df.shape[1])]
    )

print(sort_df(gapminder.head(3)))

  tag_0 tag_1      tag_2    tag_3
0   pop  year  gdpPercap  lifeExp
1   pop  year  gdpPercap  lifeExp
2   pop  year  gdpPercap  lifeExp

Объяснение: np.argsort сортирует значения по строкам, но возвращает индексы, которые сортируют массив вместо отсортированных значений, что может бытьиспользуется для совместной сортировки массивов.Минус сортирует по убыванию.В вашем случае вы используете индексы для сортировки столбцов.Numpy Broadcast заботится о возвращении правильной формы.

Время выполнения составляет около 3 мс для вашего примера против 2,5 с с вашей функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...