質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

pandas データフレームの行のソートの方法。最初の条件でソートした後、最初のソートの条件を保って、次の条件でソートする方法を教えていただきたいです。

matsutai
matsutai

総合スコア46

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

3回答

0グッド

0クリップ

209閲覧

投稿2022/10/22 15:03

前提

表題の質問が分かりにくいかと思いますが、申し訳ありません。
pandas データフレームの行のソートで、最初の条件でソートした後、最初のソートの条件を保って、次の条件でソートする方法を教えていただきたいです。

該当のソースコード

python

1下記dfを、df2のように、col2、col3、col4に「X」があるものを上になるようにソートしました。 2 3df = pd.DataFrame([['A',2,'X',1],['A',2,1,1],['C','X',1,1],['B','X',1,1],['C',6,1,1],['C',1,'X',1],['B',1,1,'X']], columns=['col1','col2','col3','col4']) 4 5 col1 col2 col3 col4 60 A 2 X 1 71 A 2 1 1 82 C X 1 1 93 B X 1 1 104 C 6 1 1 115 C 1 X 1 126 B 1 1 X 13 14上記を下のようにしてソート(Xを含む行を上になるようにするため) 15id_df = df.apply(lambda x: ~x.str.contains('X').any(), axis=1).argsort() 16df2 = df.iloc[id_df].reset_index(drop=True) 17 18 col1 col2 col3 col4 190 A 2 X 1 201 C X 1 1 212 B X 1 1 223 C 1 X 1 234 B 1 1 X 245 A 2 1 1 256 C 6 1 1 26 27上記の後で、下記のように、col2、col3、col4に「X」があるものを上になるようにソートを残して、 28col1 で再度ソートしたいです。 29 30 col1 col2 col3 col4 310 A 2 X 1 321 B X 1 1 332 B 1 1 X 343 C X 1 1 354 C 1 X 1 365 A 2 1 1 376 C 6 1 1 38

試したこと

sort_values()はいろいろ試しましたが、ダメでした。
良い方法を知っているかたがおられましたら教えてください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

8

ベストアンサー

python

1grp = df.loc[:, 'col2':'col4'].apply(lambda x: ~x.str.contains('X').any(), axis=1) 2df2 = df.groupby(grp, group_keys=False).apply(pd.DataFrame.sort_values, by='col1').reset_index(drop=True) 3print(df2)
col1col2col3col4
0A2X1
1BX11
2B11X
3CX11
4C1X1
5A211
6C611

投稿2022/10/22 15:52

編集2022/10/22 16:02
melian

総合スコア16362

spoofy_dragon, matsutai😄を押しています
spoofy_dragon👍を押しています
spoofy_dragon❤️を押しています
spoofy_dragon😍を押しています
spoofy_dragon👏を押しています
spoofy_dragon🎉を押しています
spoofy_dragonを押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

matsutai

2022/10/23 03:01

ありがとうございます。 自力でコードをかけるようになるように、いただいたコードで勉強させていただきます。

1

Xを含む、含まないという情報(True/False)の列を追加して、その列とcol1とを一緒に sort_values() するとできます。

python

1df2 = (df.assign(containX=df.apply(lambda s: s.str.contains('X')).any(axis=1)) 2 .sort_values(['containX', 'col1'], ascending=[False, True]) 3 .drop(columns='containX') 4 .reset_index(drop=True))

もしくは、先にcol1でソートしておいてから、それをXありなしでソートするのでもできます。
(優先度の高いものほど、あとからソートすることになります)
そのときあとからするソートはstable(同じ値の場合は元の順序を保持する)なものにしないといけません。

python

1df2 = df.sort_values('col1').reset_index(drop=True) 2 3id_df = df2.apply(lambda x: ~x.str.contains('X').any(), axis=1).argsort(kind='stable') 4df2 = df2.iloc[id_df].reset_index(drop=True)

投稿2022/10/22 16:10

編集2022/10/22 16:22
bsdfan

総合スコア4044

matsutai😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

xが入ってる行だけでdf抽出してそこでソートするとかですかね…
スマートではないかもしれませんが

投稿2022/10/22 15:15

Sobasenbei

総合スコア107

matsutai😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。