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

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

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

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

pandas

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

Q&A

解決済

3回答

518閲覧

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

matsutai

総合スコア53

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿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()はいろいろ試しましたが、ダメでした。
良い方法を知っているかたがおられましたら教えてください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

総合スコア19712

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsutai

2022/10/23 03:01

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

0

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

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2022/10/22 15:15

Sobasenbei

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問