pandasデータフレームの各行を並べ替えて、新しいデータフレームで並べ替えられた値のインデックスを取得しようとしています。私はゆっくりとそれを行うことができました。このために並列化またはベクトル化されたコードを使用して改善を提案できる人はいますか?以下に例を掲載しました。
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
andよりも高いため、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)
これはおそらく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秒です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加