我有一个包含数据的输入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()
答案 0 :(得分:7)
使用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')
答案 1 :(得分:2)
您可以使用Python shuffle模块中的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
请确保在每个原始行的末尾都有换行符。
答案 2 :(得分:2)
随机模块中有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 statement:
>>> 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
答案 3 :(得分:2)
我认为你应该阅读文件的实际行。
ip.readlines()
并且random.shuffle()
应该用于交换线。
目前,您读取整个字符串,我认为只能从整个文件中随机获取一个字符。
答案 4 :(得分:2)
如果您的CSV包含标题,则可以使用像这样的大熊猫对其进行随机播放。
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中删除索引。
答案 5 :(得分:1)
答案 6 :(得分:0)
我根据@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]))
答案 7 :(得分: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))