在Python中的字典子集中爆炸键和值

时间:2019-03-19 19:53:35

标签: python pandas dictionary

我正在尝试创建一种交换USGS/WWF HydroBASINS dataset的Pandas DataFrame中的键和值的方法,但仅适用于特定子集。我的整个数据框大约有50万行,所以我只想对与初始值相关的键,值对执行此操作。

假定DataFrame / Dictionary的结构为“上游”和“下游”:

{1: [2, 3], 2: [4, 5, 6], 3: [7, 8]}

因此,[1]的下游为2,[1和2]的下游为4,[1,3]的下游为7。

具有挑战性的部分是我不想确定所有键,值之间的关系,因为这将花费很长时间。对于较大的水文支流数据集,取决于上游的开始位置,这可能会导致创建一个数据帧,如果收集并确定了所有密钥的上游值,则该密钥会爆炸。

最后,当提供一个密钥时,我想返回所有上游密钥。扩展所有值类似于:

{1: [], 2: [1], 3: [1], 4: [1, 2], 5: [1, 2], 6: [1, 2], 7: [1, 3], 8: [1, 3], ...}

我宁愿简单地返回:

5: [1, 2]

我并没有像某些帖子所建议的那样与DefaultDicts合作,但运气不佳,但这可能是因为我对它们还不够熟悉。

更新:

为了更好地理解,数据框的相关字段为“ HYBAS_ID”:流域的ID号,“ NEXT_DOWN”:流域的流域(和“ MAIN_BAS”:较大的分水岭ID(例如密西西比州,圣劳伦斯省,詹姆斯湾,里奥格兰德州等))

未优化的代码如下:

def get_upstream_hydrobasins(basin_dataframe, basin_id):
    upstream_mask = basin_dataframe['NEXT_DOWN'] == basin_id
    iter_upstream = basin_dataframe[upstream_mask]['HYBAS_ID']
    return iter_upstream

basin_ID = <ID of some hydroBASIN>
df = pd.read_csv(table)
row_id = df['HYBAS_ID'] == basin_ID

# Some code to subset the number of potential sub-basins using regions
main_basin_id = df[row_id]['MAIN_BAS']
main_basin_mask = df['MAIN_BAS'] == main_basin_id.values[0]
main_basin_df = df[main_basin_mask]

all_basins = list(main_basin_df[row_id]['HYBAS_ID'].values)
for b in all_basins:
    tmp = get_upstream_hydrobasins(main_basin_df, b)
    if len(tmp):
        all_basins.extend(tmp.values)

我想知道是否有更好的方法来优化此代码。

0 个答案:

没有答案