使用字典过滤 dask 数据框

我正在尝试过滤 dask 数据帧以仅包含由字典定义的特定时间段,其中键是 ISO 区域,值是时间戳列表。


这是一个修改过的字典作为例子。


iso_region_dict = {'MISO-E':[Timestamp('2016-05-17 22:15:00'),Timestamp('2016-10-21 13:45:00'),Timestamp('2016-12-26 02:45:00')], 'CAISO':[Timestamp('2016-08-24 10:15:00'),Timestamp('2016-07-03 14:30:00'),Timestamp('2016-04-22 12:45:00')]}

我的 dask 数据框看起来像这样(timeseries_ddf):


      building_id   time    electricity_cooling_kwh electricity_heating_kwh total_site_electricity_kwh  iso_zone

0   2   2016-01-01 00:15:00 0.0 0.0 4.082225    MISO-E

1   2   2016-05-17 22:15:00 0.0 0.0 5.627103    MISO-E

2   2   2016-10-21 13:45:00 0.0 0.0 21.547435   MISO-E

3   2   2016-12-26 02:45:00 0.0 0.0 4.082225    MISO-E

4   2   2016-10-21 14:00:00 0.0 0.0 21.547435   MISO-E

完整的数据框有数千个建筑 ID,“时间”列采用日期时间格式,范围从 2016-1-1 到 2016-12-31,每个 building_id 的间隔为 15 分钟。我想过滤此数据框以仅包含在 iso_region_dict 中为每个 building_id 定义的时间列中的时间戳。这是一个非常大的数据框,这就是我使用 dask 的原因。


期望的输出(timeseries_discharge_ddf):


building_id time    electricity_cooling_kwh electricity_heating_kwh total_site_electricity_kwh  iso_zone

    0   2   2016-05-17 22:15:00 0.0 0.0 5.627103    MISO-E

    1   2   2016-10-21 13:45:00 0.0 0.0 21.547435   MISO-E

    2   2   2016-12-26 02:45:00 0.0 0.0 4.082225    MISO-E

我用时间戳列表做了类似的事情,我只是通过以下方式过滤:


timeseries_discharge_ddf = timeseries_ddf.map_partitions(lambda x: x[x.time.isin(discharge_timestamps)])

我现在尝试实现的附加步骤是这个过滤器,但是 discharge_timestamps 列表的变化取决于 iso_zone 是什么。


饮歌长啸
浏览 97回答 1
1回答

BIG阳

我认为在这里使用 merge 或 join 会更容易。数据import pandas as pdimport dask.dataframe as dddiz_df = {'building_id': {0: 2, 1: 2, 2: 2, 3: 2, 4: 2}, 'time': {0: '2016-01-01 00:15:00',  1: '2016-05-17 22:15:00',  2: '2016-10-21 13:45:00',  3: '2016-12-26 02:45:00',  4: '2016-10-21 14:00:00'}, 'electricity_cooling_kwh': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}, 'electricity_heating_kwh': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}, 'total_site_electricity_kwh': {0: 4.082225,  1: 5.627103,  2: 21.547435,  3: 4.082225,  4: 21.547435}, 'iso_zone': {0: 'MISO-E', 1: 'MISO-E', 2: 'MISO-E', 3: 'MISO-E', 4: 'MISO-E'}}diz_filter = {'iso_zone': {0: 'MISO-E',  1: 'MISO-E',  2: 'MISO-E',  3: 'CAISO',  4: 'CAISO',  5: 'CAISO'}, 'time': {0: '2016-05-17 22:15:00',  1: '2016-10-21 13:45:00',  2: '2016-12-26 02:45:00',  3: '2016-08-24 10:15:00',  4: '2016-07-03 14:30:00',  5: '2016-04-22 12:45:00'}}df = pd.DataFrame(diz_df)df_filter = pd.DataFrame(diz_filter)# converting to datetimedf["time"] = df["time"].astype("M8")df_filter["time"] = df_filter["time"].astype("M8")使用pandasdf_out = pd.merge(df, df_filter, on=["time", "iso_zone"])使用daskdf = dd.from_pandas(df, npartitions=2)# It doesn't matter if the second dataframe is pandas or dask# df_filter = dd.from_pandas(df_filter, npartitions=2)df_out = dd.merge(df, df_filter, on=["time", "iso_zone"])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python