我有140个csv文件。每个文件有3个变量,大约750 GB。观察数量从6千万到9千万不等。
我还有另一个小文件,treatment_data - 138000行(每个唯一ID)和21列(ID
的01列和1和0的20列,表明ID是否给予特定处理。
变量是,
ID_FROM
:数字IDID_TO
:数字IDDISTANCE
:ID_FROM
和ID_TO
之间物理距离的数值变量(总的来说,我有138000 * 138000(= 19亿以上)行 - 对于每个可能的双向组合所有ID,分为140个文件。
研究问题:给定距离,ID
有多少邻居(每种治疗类型)。
所以我需要一个系统的帮助(最好是在Pandas中)
DISTANCE
和ID_FROM
之间的ID_TO
小于给定距离的行DISTANCE
)ID_TO
和ID
将数据框架与treatment_data合并。 (此时可以放弃ID_TO
)ID_FROM
(group_by)将数据折叠起来,并将20与治疗变量相加。(在最终输出数据集中,我将拥有138000行和21列.01列为ID
。每列不同的处理类型为20列。因此,例如,我将能够回答问题,“在'2000'米内, '500'(ID)的多少个邻居在'treatment_media'类别中?“
重要注意事项:
DISTANCE
变量的范围在0到大致平均大小的美国州的半径(以米为单位)。研究人员最感兴趣的是看5000米内发生了什么。这通常会减少98%的观察结果。但有时,他/她会检查更长的距离
衡量。所以我必须保持所有观察结果。否则,我可以简单地从原始输入文件中过滤出超过5000的DISTANCE
,让我的生活更轻松。我认为这很重要的原因是,数据基于ID_FROM
在140个文件中进行排序。如果我能够以某种方式重新排列这些基于DISTANCE
的19亿行并且关联它们有某种字典系统,那么该程序不需要遍历所有140个文件。大多数时候,研究人员只会研究DISTANCE
范围的2%。我需要循环140个文件似乎是一个巨大的浪费时间。但这是次要的想法。即使您不能使用这个额外的附注,请提供答案。是否有一个特殊的原因需要在Python中完成整个事情?这似乎是SQL数据库非常擅长的东西。我认为像以下这样的基本概要可以起作用:
TABLE Distances {
Integer PrimaryKey,
String IdFrom,
String IdTo,
Integer Distance
}
INDEX ON Distances(IdFrom, Distance);
TABLE TreatmentData {
Integer PrimaryKey,
String Id,
String TreatmentType
}
INDEX ON TreatmentData(Id, TreatmentType);
-- How many neighbors of ID 500 are within 2000 meters and have gotten
-- the "treatment_media" treatment?
SELECT
d.IdFrom AS Id,
td.Treatment,
COUNT(*) AS Total
FROM Distances d
JOIN TreatmentData td ON d.IdTo = td.Id
WHERE d.IdFrom = "500"
AND d.Distance <= 2000
AND td.TreatmentType = "treatment_media"
GROUP BY 1, 2;
可能还有其他一些索引组合可以提供更好的性能,但这似乎至少可以回答你的例子问题。