通过Python分散CSV中的随机抽样

时间:2014-01-07 23:39:09

标签: python python-2.7 csv random pandas

我有一个(大)目录CSV,其列为[0:3] =电话号码,姓名,城市,州。

我创建了一个包含20,000个条目的随机样本,但当然,它对人口较多的州和城市进行了大量加权。

我如何编写一个python代码(使用CSV或Pandas - 我没有可用的linecache)同样优先考虑/加权每个独特城市和每个州(单独,不是一对),并限制每个唯一城市到3个选秀权?


TRICKIER想法:我如何编写一个python代码,以便对于每个被挑选的随机行,它会检查之前是否已经选择了该城市。如果之前已经选择了该城市,它会忽略它并再次选择一条随机线,将该城市之前考虑的选择数减少一个。所以说,它随机选择了圣安东尼奥马刺队,之前已经两次被选中。该脚本忽略此选择,将其放回列表中,减少当前考虑的圣安东尼奥选择的数量,然后再次随机选择一行。如果它再次从圣安东尼奥挑选一条线,那么它会重复前一个过程,现在减少考虑的圣安东尼奥选择为0.所以它必须连续三次选择圣安东尼奥,以增加圣安东尼奥的另一条线。对于未来的选秀权,它必须连续四次选择圣安东尼奥马刺队,并且每增加一个选秀权一次。

我不知道第二个选项如何能够“分散”我的随机选择 - 这只是一个想法,它看起来像一个学习更多pythonese的有趣方式。我们将非常感谢沿着同一思路的任何其他想法。我们也欢迎对统计抽样和样本散布的见解。

1 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一点,但抽象算法应该是这样的。

首先,要创建一个符合第二个标准的新CSV,关于以相同概率绘制每个状态,请按如下方式绘制每一行。

1)从状态集中,绘制一个状态(每个状态绘制的概率为1 /#状态)。让那个州成为s。

2)从大型CSV中,从STATE = s的行集中绘制一行。

在绘制行时,记录从给定的州/城市对中抽取的行数。你可以用字典做到这一点。然后,每次绘制一个连续的行时,如果有任何州/城市对等于用户设置的上限,则在上面的步骤2中从条件抽签中排除那些州/城市对。这将满足您的第一个要求。

这有意义吗?如果您开始使用一些试图实现此功能的代码,如果它有任何问题,我很乐意为您整理一下。

如果你想做一个“有点棘手”的算法,其中选择一个城市的概率会随着每个选择而减少,你可以毫不费力地做到这一点。基本上,在你绘制s之后对州内城市的条件,然后根据该州的每个城市被绘制的次数加权(你有这个信息,因为你一直存储它来实现第一个要求)。您必须提出加权函数的形式,因为您的描述并未暗示。

同样,如果您尝试对此进行编码,我很高兴看看您发布的任何代码并提出建议。