Abd*_*ran 6 python performance pandas data-science
假设我有数据帧df1,其中包括两列 - A和B.A值表示较低范围,B值表示较高范围.
A B
10.5 20.5
30.5 40.5
50.5 60.5
Run Code Online (Sandbox Code Playgroud)
我有另一个数据框,其中包括两列 - 包含不同数字范围的C&D.
C D
12.34 15.90
13.68 19.13
33.5 35.60
35.12 38.76
50.6 59.1
Run Code Online (Sandbox Code Playgroud)
现在我想列出df2中属于df1组(在低范围和高范围之间)的所有对.
最终输出应该是这样的 -
Key Values
(10.5, 20.5) [(12.34, 15.90), (13.68, 19.13)]
(30.5, 40.5) [(33.5, 35.60), (35.12, 38.76)]
(50.5, 60.5) [(50.6, 59.1)]
Run Code Online (Sandbox Code Playgroud)
解决方案应该是高效的,因为我有5000组范围和85000个不同范围的数字.
在我的计算机上,它的速度不是很快(约 30 秒),但multiprocessing如果您有多个内核,则可以轻松地通过该包加速。
生成数据:
def get_fake(n):
df = pd.DataFrame(np.random.rand(n * 2).reshape(-1, 2))
df.loc[:, 1] += 1
return df
df1 = get_fake(200)
df2 = get_fake(90000)
Run Code Online (Sandbox Code Playgroud)
然后对于处理部分:
from collections import defaultdict
result = defaultdict(list)
for index, start, stop in df1.itertuples():
subdf = df2[(start < df2.iloc[:, 0]) & (df2.iloc[:, 1] < stop)]
result[(start, stop)] += subdf.values.tolist()
Run Code Online (Sandbox Code Playgroud)
结果是一个字典,但如果需要,可以轻松转换为系列。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |