从Pandas DataFrame中提取样本,并保留所有相同类型的值

时间:2018-07-08 14:04:37

标签: python pandas

我有一个如此大的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)

但这只给了我行的随机样本。我想获取的是类型的随机样本

我想到的是一般流程:

  1. 将整个CSV导入Pandas DataFrame中
  2. 生成要提取的(随机)类型列表(例如[A,B])
  3. 仅从DataFrame中提取类型为“ A”或“ B”的行

结果应该是这样的:

type  value
A     1
B     4
A     25
B     7

感谢您能提供的任何帮助。

1 个答案:

答案 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