web-dev-qa-db-ja.com

Python)を使用してcsvファイルのすべての行をシャッフルします

データを含む入力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()
5
Rosh Verma

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')
9
Fabio Lamanna

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

元の各行の最後に改行があることを確認してください。

4
armatita

shuf を使用できます。

shufをインストールしたら、

shuf -o shuffled-file.csv < file-to-shuffle.csv
3

ランダムモジュールには 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
2
fredtantini

ファイルの実際の行を読む必要があると思います。

_ip.readlines()
_

また、random.shuffle()を使用して行を入れ替える必要があります。

現時点では、文字列全体を読み取っていますが、ファイル全体からランダムに1文字しか取得されないと思います。

2
cricket_007

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からインデックスを削除できます。

1
a_k_v