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

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

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

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

pandas

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

Q&A

解決済

2回答

3049閲覧

python pandas データフレームを列ごとにソートししたはずが他の列もソートされている

TheBullchannel

総合スコア33

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2021/04/06 13:51

編集2021/04/06 23:55

あるデータフレームを列ごとに並び替えをしたく、下記のコードを書いて実行したところ
最終列の結果のみソートされ、他の列はソートされていませんでした。
for文で回さずに、1列のみsort したところ、その列はソートされていたことから、for文を
回した際に、他の列の値まで影響を受けているように思います。

また、このデータフレームにはランダムにnanが含まれているため、
列ごとにソートして、最後にすべての列がnanの行を削除したいと考えております。

正常に動かない原因や間違いなどございましたら教えていただけませんでしょうか。

countname = ["a1","b1","c1","d1"] count_res = pd.DataFrame(index=100,columns=countname) for j in countname: count_res.sort_values('{}'.format(j),na_position="last", inplace=True)

実現したいことは、nanがランダムに含まれるデータフレームの数値を上から詰めていき、
最後に、すべての列がnanとなっている行を削除したいです。
イメージ説明
のようにしたいということです。
これを、列ごとにソートして実現しようとしておりました。

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

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

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

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

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

meg_

2021/04/06 14:11

やりたい事は何でしょうか?具体例を提示されると回答しやすいかと思います。
guest

回答2

0

ベストアンサー

pd.DataFrame.sort_values()メソッドは、特定の列を基準にしてデータフレームの行を並び替えるメソッドです。

python

1In [11]: count_res 2Out[11]: 3 a1 b1 c1 d1 40 1 3 4 None 51 None 2 3 4 62 2 None 4 3 73 None 3 2 None 84 3 None None None 9 10In [12]: count_res.sort_values('a1') 11Out[12]: 12 a1 b1 c1 d1 130 1 3 4 None 142 2 None 4 3 154 3 None None None 161 None 2 3 4 173 None 3 2 None

今回の質問では各列内のデータを並び替えるということで、列ごとに.sort_values()を適用させる(※)必要がありますので、例えば.apply()メソッドを使って、

※このときインデックスを無視しなければ最後に整列されて元のフレームと同じものが返ってきてしまうのでignore_index=Trueを指定するか、reset_index()メソッドをさらに適用する。

python

1In [13]: count_res.apply(lambda x: x.sort_values(ignore_index=True)) 2Out[13]: 3 a1 b1 c1 d1 40 1 2 2 3 51 2 3 3 4 62 3 3 4 None 73 None None 4 None 84 None None None None 9 10In [14]: count_res.apply(lambda x: x.sort_values().reset_index(drop=True)) 11Out[14]: 12 a1 b1 c1 d1 130 1 2 2 3 141 2 3 3 4 152 3 3 4 None 163 None None 4 None 174 None None None None

投稿2021/04/07 00:57

編集2021/04/07 01:03
kirara0048

総合スコア1399

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

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

TheBullchannel

2021/04/10 13:41

データフレームを更新していると思っていたのですが、applyで適用しなければならなかったのですね。 大変参考になりました。 ご回答ありがとうございました。
guest

0

実現したいことは、nanがランダムに含まれるデータフレームの数値を上から詰めていき、最後に、すべての列がnanとなっている行を削除したいです。

そういうのを最初に書いてくれればとても簡単です。

python

1>>> print(count_res) 2 a1 b1 c1 d1 30 5.384058 0.026853 0.076923 2.716981 41 1.507645 NaN 1.945513 3.923077 52 0.177189 0.435654 2.516245 0.294964 63 47.000000 1.015123 0.104000 0.018237 74 NaN NaN 1.258297 0.932941 85 0.081967 NaN 0.045249 0.501319 96 0.805804 5.803681 0.083333 0.443567 107 1.565878 NaN 0.610422 NaN 118 NaN 2.991228 NaN NaN 129 NaN 0.465946 0.457447 0.632156 1310 2.848485 2.640625 0.626437 0.607256 1411 NaN 0.626437 NaN 1.708333 1512 0.662539 0.076923 1.446903 2.848485 1613 1.760814 0.457447 1.824497 0.960552 1714 3.505682 0.276029 0.717063 0.753906 1815 0.646630 0.304942 NaN 4.103226 1916 1.762832 1.921788 1.762832 NaN 2017 0.741304 2.336323 0.465946 0.617564 2118 4.420000 0.255647 0.443567 1.582996 2219 0.071301 NaN 0.805804 2.336323 23>>> temp = count_res.copy() 24>>> temp[temp.columns] =float("NaN") 25>>> for column in count_res.columns: 26... temp[column] = count_res[column].dropna().reset_index(drop=True) 27... 28>>> result = temp.dropna(how='all') 29>>> print(result) 30 a1 b1 c1 d1 310 5.384058 0.026853 0.076923 2.716981 321 1.507645 0.435654 1.945513 3.923077 332 0.177189 1.015123 2.516245 0.294964 343 47.000000 5.803681 0.104000 0.018237 354 0.081967 2.991228 1.258297 0.932941 365 0.805804 0.465946 0.045249 0.501319 376 1.565878 2.640625 0.083333 0.443567 387 2.848485 0.626437 0.610422 0.632156 398 0.662539 0.076923 0.457447 0.607256 409 1.760814 0.457447 0.626437 1.708333 4110 3.505682 0.276029 1.446903 2.848485 4211 0.646630 0.304942 1.824497 0.960552 4312 1.762832 1.921788 0.717063 0.753906 4413 0.741304 2.336323 1.762832 4.103226 4514 4.420000 0.255647 0.465946 0.617564 4615 0.071301 NaN 0.443567 1.582996 4716 NaN NaN 0.805804 2.336323

でいいですか。

問題が変わってしまったので、以下は無視してください。

TheBullchannelさんがやりたいこととpandasのソートに仕様が違っています。

やりたいことは、以下のコードでできるでしょう。

python

1for j in countname: 2 df[countname]=df[countname].sort_values(na_position="last").reset_index()[countname]

投稿2021/04/06 14:21

編集2021/04/07 09:18
ppaul

総合スコア24672

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

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

TheBullchannel

2021/04/06 23:22

ご回答ありがとうございます。 count_res[countname]=count_res[countname].sort_values(na_position="last").reset_index()[countname] に変更して実行したところ、TypeError: sort_values() missing 1 required positional argument: 'by' とエラーが出ました。 そのため、byの引く数を入れ、 count_res[countname]=count_res[countname].sort_values(by=['{}'.format(j)],na_position="last").reset_index()[countname] 再度実行したところ、もとの結果となってしまいました。
ppaul

2021/04/07 02:06

TypeError: sort_values() missing 1 required positional argument: 'by'がでるのはおかしいですね。 ひょっとして、 countname = [["a1"],["b1"],["c1"],["d1"]] とかになっていませんか?
TheBullchannel

2021/04/11 01:47

ありがとうございます。 尾恥ずかしながらdropnaの存在をすっかり忘れておりました。 dropnaを使ったことで、すんなりと解決いたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問