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