[英]Shuffle all rows of a csv file with Python
我有一个包含数据的输入 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')
您可以使用 Python random模块中的shuffle函数。 像这样:
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
只需确保在每个原始行的末尾都有一个换行符。
random 模块中有一个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 语句:
>>> 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()
来交换线条。
目前,您读取了整个字符串,我认为只能从整个文件中随机获取一个字符。
如果您的 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 中删除索引。
我根据@cricket 的回答使用此代码:
from random import shuffle
with open('input.csv','r') as f1:
data=f1.readlines()
shuffle(data[0])
with open('output.csv','w') as f2:
f2.write(''.join([data[1:]] + data[0]))
我按照这条路。
import numpy as np
import pandas as pd
df = pd.read_csv("your_csv_file.csv", header=0)
df.reindex(np.random.permutation(df.index))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.