スポンサーリンク

[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

スポンサーリンク