スポンサーリンク
[Python]pandasのDataFrameで特定の列のみランダムに並べ替える
下記のin.txtがあったときに、2列目のみランダムに並べ替えてDataFrameを作りたい場合がありました。
他に良い方法があるかもですが、とりあえず紹介してみたいと思います。
$ cat in.txt 20030801,0 20030802,1 20040203,2 20040204,3 20040305,4
スポンサーリンク
まずはread_csv()でcsvファイルを読み込む
まずはread_csv()でcsvファイルを読み込みます。
それぞれの列名を、DateとValueとしました。
import pandas as pd df1 = pd.read_csv('in.txt', names=('Date', 'Value'))
特定の列のみsample(frac = 1)でランダムに並べ替えて、reset_index(drop = True)でインデックスを再設定
下記のようにValueの列のみ取り出して、sample(frac = 1)でランダムに並べ替えて、reset_index(drop = True)でインデックスを再設定します。
sample()はランダムにサンプリングするが、frac = 1とすることで、全ての行をサンプリングしてくれます。
df2 = df1.Value.sample(frac = 1).reset_index(drop = True)
スポンサーリンク
concatでaxis = 1を設定して列同士を結合
下記のように、concat()でDateの列と先程ランダムに並べ替えたValueの列を結合します。
列同士を結合するので、axis = 1を設定します。
df3 = pd.concat([df1.Date, df2], axis = 1)
to_datetime()でdatetime型に変換し、set_index()でインデックスに再設定
今回はDate列をdatetime型でインデックスにしたかったので、下記の操作も実行しました。
df3['Date'] = pd.to_datetime(df3['Date'], format = '%Y%m%d') df3.set_index('Date', inplace = True)
サンプルコード
下記がサンプルコードになります。
$ cat sample.py #!/usr/bin/env python3 # coding: UTF-8 import pandas as pd df1 = pd.read_csv('in.txt', names=('Date', 'Value')) print("並べ替え前") print(df1) df2 = df1.Value.sample(frac = 1).reset_index(drop = True) df3 = pd.concat([df1.Date, df2], axis = 1) print("\n並べ替え後") print(df3) df3['Date'] = pd.to_datetime(df3['Date'], format = '%Y%m%d') df3.set_index('Date', inplace = True) print("\ndatetime型でインデックスを再設定") print(df3)
下記が実行結果になります。
$ ./sample.py 並べ替え前 Date Value 0 20030801 0 1 20030802 1 2 20040203 2 3 20040204 3 4 20040305 4 並べ替え後 Date Value 0 20030801 2 1 20030802 4 2 20040203 0 3 20040204 1 4 20040305 3 datetime型でインデックスを再設定 Value Date 2003-08-01 2 2003-08-02 4 2004-02-03 0 2004-02-04 1 2004-03-05 3
スポンサーリンク