【问题标题】:Create subset Dask dataframe based on another Dask dataframe基于另一个 Dask 数据帧创建子集 Dask 数据帧
【发布时间】:2020-01-08 15:36:47
【问题描述】:

我有两个 Dask 数据帧,长度为 5000 的 df1 和长度为 100000 的 df2,都带有 start_time 和 end_time 列。我试图找到 df2 的 start_time-end_time 间隔小于或等于 df1 的 start_time-end_time 间隔的 df1 行(df1.start_time

我尝试了以下方法,但无济于事:

df3 = dd.from_pandas(pd.DataFrame(), npartitions=1)
for _, df2_row in df2.iterrows():
    df3_chunk = df1.apply(lambda df1_row: df1_row.start_time <= df2_row.start_time <= df2_row.end_time <= df1_row.end_time, axis=1)
    df3 = dd.concat([df3, df3_chunk])
df3 = pd.DataFrame()
for _, df2_row in df2.iterrows():
    df3_chunk = df1.loc[df1.start_time <= df2_row.start_time <= df2_row.end_time <= df1.end_time]
    df3 = dd.concat([df3, df3_chunk])

第一个 sn-p 一直在运行,而第二个返回 ValueError: Not all divisions are known, can't align partitions. Please use `set_index` to set the index.

示例输入(df1、df2)和输出(df3):

# df1
start_time, end_time
2019-10-10 01:01:01, 2019-10-11 01:01:01
2001-01-01 00:00:01, 2001-02-02 03:04:05

# df2
start_time, end_time
2019-10-10 09:07:05, 2019-10-10 11:12:10

# df3
start_time, end_time
2019-10-10 01:01:01, 2019-10-11 01:01:01

有没有办法做到这一点?

【问题讨论】:

  • 欢迎使用 Stackoverflow,请提供您的数据框示例和您的预期输出
  • 谢谢。我用示例输入和输出编辑了问题:-)

标签: python pandas dataframe dask


【解决方案1】:

从必要的导入开始:

import dask.dataframe as dd

出于测试目的,我阅读了源 (Pandas) DataFrames (df1df2) 然后将它们转换为 Dask DataFrames:

dd1 = dd.from_pandas(df1, npartitions=2)
dd2 = dd.from_pandas(df2, npartitions=2)

在你的程序中(我想)你会直接从 相应的输入文件。

然后定义如下函数:

def enclosesAny(row, other):
    return (other.start_time.ge(row.start_time) &
        other.end_time.le(row.end_time)).any()

而实际计算分为2步:

  1. Compute encl 列 - 应用上述函数的结果 到每一行:

    dd1['encl'] = dd1.map_partitions(enclosesAny, other=dd2)
    
  2. 生成实际结果。它包含来自 dd1 的行 enclTrue。为了不使结果混乱 列,我删除了 encl 列:

    result = dd1[dd1.encl].drop('encl', axis=1).compute()
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2018-06-07
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多