あるデータフレームを列ごとに並び替えをしたく、下記のコードを書いて実行したところ
最終列の結果のみソートされ、他の列はソートされていませんでした。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア1399
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

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総合スコア24672
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。