python - 使用字典过滤 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 是什么。
解决方案
我认为在这里使用合并或加入会更容易。
数据
import pandas as pd
import dask.dataframe as dd
diz_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 datetime
df["time"] = df["time"].astype("M8")
df_filter["time"] = df_filter["time"].astype("M8")
使用pandas
df_out = pd.merge(df, df_filter, on=["time", "iso_zone"])
使用dask
df = 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"])
推荐阅读
- html - 即使包含元标记,网站响应也无法在移动设备上运行
- authentication - Passport JS 失败Flash。它是如何连接到连接闪存的?
- qt - 我在使用 DropShadow 和 Ripple 时遇到了冲突
- perl - 将多个哈希作为参数传递给 Perl 子例程 (Perl 5.16 / Perl 5.30)
- javascript - 设置有状态值并同时提交需要该值的表单
- google-apps-script - 根据两个单独列中的值删除行
- angular - 角度 SVG 渐变填充不渲染
- javascript - 带有 Node.js CLIENT_MISSING_INTENTS 错误的 Discord Bot
- kubernetes - Traefik 作为入口控制器 - 匹配 HTTP 方法
- visual-studio - visual studio 2017 如何保存我的选择以在 Locall IIS 上而不是在 IISEXPRESS 上运行我的项目?