我有一个如此大的CSV文件:
type, value
A 1
B 4
C 6
A 25
D 5
B 7
由于要处理的行太多,因此我想获取一个样本,但此样本的特殊性如下:必须取所有相同类型的行。
我从随机抽取行开始:
num_lines = sum(1 for line in open('file.csv') - 1
sample_lines = int(num_lines * 0.01)
skip = sorted(random.sample(range(num_lines), num_lines - sample_lines))
df = pd.read_csv('file.csv', sep=';', skiprows=skip)
但这只给了我行的随机样本。我想获取的是类型的随机样本。
我想到的是一般流程:
结果应该是这样的:
type value
A 1
B 4
A 25
B 7
感谢您能提供的任何帮助。
答案 0 :(得分:2)
这是正确的方法吗?
首先,通过从CSV导入创建DataFrame。 然后,创建一个包含所有可能类型列表的数组,并仅选择其中n种(随机)。 最后,保存仅具有这n种类型(但具有与之相关的所有数据)的新DataFrame。
n = 10
df = pd.read_csv('file.csv', sep=';')
random_types = np.random.choice(df.type.unique(), n)
m = df['type'].isin(random_types)
df_sample = df.loc[m]
这种方法的缺点是必须将整个CSV加载到内存中。
完整示例
import pandas as pd
import numpy as np
np.random.seed(400)
data = '''\
type value
A 1
B 4
C 6
A 25
D 5
B 7'''
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+')
n = 2
random_types = np.random.choice(df.type.unique(), n)
print(df.loc[df['type'].isin(random_types)])
返回:
type value
0 A 1
3 A 25
4 D 5