从大型CSV创建代表性样本

时间:2016-02-02 15:54:57

标签: python r bash csv subset

我有以下数据集:

head -2 trip_data_1.csv

medallion,hack_license,vendor_id,rate_code,store_and_fwd_flag,pickup_datetime,dropoff_datetime,passenger_count,trip_time_in_secs,trip_distance,pickup_longitude,pickup_latitude,dropoff_longitude,dropoff_latitude
89D227B655E5C82AECF13C3F540D4CF4,BA96DE419E711691B9445D6A6307C170,CMT,1,N,2013-01-01 15:11:48,2013-01-01 15:18:10,4,382,1.00,-73.978165,40.757977,-73.989838,40.751171

按日期的简单记录计数给出了以下输出:

Count  Date
557203 2013-01-26
543734 2013-01-18
537188 2013-01-25
533039 2013-01-24
531161 2013-01-31
521398 2013-01-11
520520 2013-01-23
512533 2013-01-17
510530 2013-01-19
507429 2013-01-12
500065 2013-01-16
496899 2013-01-15
496005 2013-01-22
487949 2013-01-10
482378 2013-01-30
478437 2013-01-04
477380 2013-01-29
473804 2013-01-05
470833 2013-01-27
459393 2013-01-20
457471 2013-01-09
450789 2013-01-28
443650 2013-01-14
442541 2013-01-13
441778 2013-01-08
441233 2013-01-03
412630 2013-01-01
407363 2013-01-07
403667 2013-01-06
393001 2013-01-02
384614 2013-01-21

我的问题是:如何创建一个子集(最好是总行数的10%),使其代表整个数据集?我需要确保每个日期至少有40,000行数据。

Link to the dataset

2 个答案:

答案 0 :(得分:2)

您可以像这样使用npm help init

awk

它只是在读取每条记录时生成0到1之间的随机数,如果该随机数是> 1。 0.9,它打印记录 - 因此它应该平均打印10%的记录。

如果您还想要标题,请使用:

awk 'rand()>0.9' trip_data_1.csv

如果你想要它真正随机,而不是可预测的随机: - )

awk 'FNR==1 || rand()>0.9' trip_data_1.cv

答案 1 :(得分:1)

随机抽样:

sort -R filename | head -n $(($(wc -l filename | awk '{print $1}') / 10))
# random sort    | get     10%   ( length divided by 10 )

您必须先删除CSV标头,然后将其重新附加。把它留作练习:)

出于效率原因,您可能希望使用本机应用程序实现此功能。