从表中随机选择行 - Python Pandas 读取 SQL

Posted

技术标签:

【中文标题】从表中随机选择行 - Python Pandas 读取 SQL【英文标题】:Randomly Choose Rows from Table - Python Pandas Read SQL 【发布时间】:2019-03-06 11:04:08 【问题描述】:

我必须在给定的日期时间范围内从 GRE 表中随机选择行。我现在做的方式是在日期时间范围内查询表,然后随机选择行。(请参见下文)这在查询方面变得非常低效,因为我在该范围内有 10 GB 的数据。有一个更好的方法吗?请指教

sp = pd.read_sql("SELECT * FROM table1 WHERE timestamp >= '"+sampling_start_date+"' and timestamp <= '"+sampling_end_date+"'", con)

random_subset = sp.sample(n=300)

时间戳格式如下

sampling_start_date = "2018-08-17 20:00:00"

【问题讨论】:

是 Postgres 吗?无论如何,也许您可​​以对 select 语句中的行进行采样,例如在 WHERE 子句中添加 AND random() &lt; 0.2 之类的内容(这将选择大约 20% 的行)。 谢谢@amitr:我可以给行数一些值吗? 不客气。我已经添加了一个更完整的答案,请看一下。 【参考方案1】:

从表中随机选择行数

可以使用随机数 SQL 函数选择行的随机样本。例如在 PostgreSQL 中是random()

选择的行数取决于在没有随机抽样的情况下将选择的行数,以及抽样概率,

例如,如果表包含 5,000 行,并且采样概率小于 0.1,则将选择大约 500 行(5,000 的 10%)。

如果 WHERE 子句在没有随机抽样的情况下会选择 1,500 行,并且抽样概率小于 0.2,那么将选择大约 300 行(1,500 行的 20%)。

请注意,使用此方法您无法保证所选行的确切数量(这就是概率的本质......),因此为了获得接近您想要的行数,您必须适当地选择概率.

还请注意,如果您想重复此过程并每次都获得相同的结果,则必须为随机数生成器设置相同的值。您可以使用 setseed() 函数来做到这一点:

SELECT setseed(.123);

最后,random() 函数存在于 PostgeSQL 中。其他数据库引擎可能对该函数使用不同的名称(例如,在 mysql 和 SQL Server 中,我相信它是 rand())。

有关一些示例,请参阅以下 select 语句。

-- all rows
select count(*) from my_table;
--   5264

-- should get about half of all rows
select count(*) from my_table where random() < 0.5;
--  2734

-- should get about 10% of all rows
select count(*) from my_table where random() < 0.1;
--   513

-- all rows matching some criteria
select count(*) from my_table where id > 100000 and id < 400000;
-- 3023

-- about half of the rows matching the above criteria
select count(*) from my_table where id > 100000 and id < 400000 and random() < 0.5;
-- 1527

-- about 10% of the rows matching the above criteria
select count(*) from my_table where id > 100000 and id < 400000 and random() < 0.1;
-- 283

【讨论】:

以上是关于从表中随机选择行 - Python Pandas 读取 SQL的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择行,使其列的计算值总和小于给定限制

MYSQL QUERY:为每个相册从表中选择 1 行照片

sql 从表中选择随机n%记录

从表中随机选择一定百分比的条目

在MySQL中从表中随机选择一行

从表中选择随机记录,但不超过2个同名记录