pandasデータフレームの各行を並べ替え、行の並べ替えられた値に基づいて列インデックスを返す方法

ラビM

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は常にgdpPercapandよりも高いため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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ