データを含む入力csvファイルがあります:
a 15
b 14
c 20
d 45
入力ファイルから完全なデータ行を含む別のcsvファイルを生成したいのですが、行をシャッフルする必要があります。
出力ファイルのように値が含まれる場合があります-
b 14
a 15
c 20
d 45
私はこのコードを試しました:
import random
import sys
op=open('random.csv','w+')
ip=open(sys.argv[1],'r')
data=ip.read()
data1=str(random.choices(data))
op.write(data1)
op.close()
pandas
を使用した別のショット。 .csvファイルは次のコマンドで読み取ることができます。
df = pd.read_csv('yourfile.csv', header=None)
次に、df.sample
を使用して行をシャッフルします。これにより、行がシャッフルされたデータフレームのランダムサンプルが返されます。 frac=1
を使用すると、セット全体をサンプルと見なします。
In [18]: df
Out[18]:
0 1
0 a 15
1 b 14
2 c 20
3 d 45
In [19]: ds = df.sample(frac=1)
In [20]: ds
Out[20]:
0 1
1 b 14
3 d 45
0 a 15
2 c 20
新しいシャッフルファイルを再度保存する必要がある場合は、次のことができます。
ds.to_csv('newfile.csv')
shuffle 関数をPython random モジュールから使用できます。次のようになります。
import random
fid = open("example.txt", "r")
li = fid.readlines()
fid.close()
print(li)
random.shuffle(li)
print(li)
fid = open("shuffled_example.txt", "w")
fid.writelines(li)
fid.close()
印刷コマンドの結果は次のとおりです。
['b 14\n', 'a 15\n', 'c 20\n', 'd 45\n']
['d 45\n', 'a 15\n', 'b 14\n', 'c 20\n']
そして、新しいファイルはこれです:
d 45
a 15
b 14
c 20
元の各行の最後に改行があることを確認してください。
ランダムモジュールには shuffle 関数があります。また、リストを作成するためにreadlines()
を実行できます。
>>> ip=open('random.csv','r')
>>> data=ip.readlines()
>>> data
['a 15\n', 'b 14\n', 'c 20\n', 'd 45\n']
>>> from random import shuffle
>>> shuffle(data)
>>> data
['c 20\n', 'd 45\n', 'a 15\n', 'b 14\n']
ヘッダーがある場合は、データを分割し、行をシャッフルします。
>>> ip=open('random.csv','r')
>>> data=ip.readlines()
>>> header, rest=data[0], data[1:]
>>> header
'h1 h2\n'
>>> rest
['a 15\n', 'b 14\n', 'c 20\n', 'd 45\n']
>>> shuffle(rest)
>>> rest
['c 20\n', 'd 45\n', 'a 15\n', 'b 14\n']
>>> [header]+rest
['h1 h2\n', 'c 20\n', 'd 45\n', 'a 15\n', 'b 14\n']
ステートメントでの使用:
>>> with open('random.csv','r') as ip:
... data=ip.readlines()
...
>>> header, rest=data[0], data[1:]
>>> shuffle(rest)
>>> with open('output.csv','w') as out:
... out.write(''.join([header]+rest))
...
>>>
~$ cat output.csv
h1 h2
d 45
b 14
a 15
c 20
ファイルの実際の行を読む必要があると思います。
_ip.readlines()
_
また、random.shuffle()
を使用して行を入れ替える必要があります。
現時点では、文字列全体を読み取っていますが、ファイル全体からランダムに1文字しか取得されないと思います。
CSVにヘッダーが含まれている場合は、このようにpandasを使用してシャッフルできます。
df = pd.read_csv(file_name) # avoid header=None.
shuffled_df = df.sample(frac=1)
shuffled_df.to_csv(new_file_name, index=False)
このようにして、ヘッダーのシャッフルを回避し、新しいCSVからインデックスを削除できます。