[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
