如何对熊猫数据框的每一行进行排序并根据行的排序值返回列索引

时间:2018-11-28 22:54:00

标签: python pandas sorting

我正在尝试对熊猫数据框的每一行进行排序,并获取新数据框中排序值的索引。我可以用很慢的方式做。谁能为此建议使用并行化或矢量化代码进行改进。我在下面发布了一个示例。

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始终高于gdpPercaplifeExp,因此它总是排在第一位。

我可以通过使用以下代码来实现所需的输出。但是,如果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 :(得分:1)

这可能与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广播负责返回正确的形状。

示例运行时间约为3毫秒,而函数运行时约为2.5毫秒。