在Python中分解字典子集中的键和值

在Python中分解字典子集中的键和值,python,pandas,dictionary,Python,Pandas,Dictionary,我正在尝试创建一种在的数据帧中交换键和值的方法,但只交换特定子集的键和值。我的整个数据帧大约有500000行长,所以我只想对与初始值相关的键、值对执行此操作 假设数据帧/字典的结构为“上游”和“下游”: {1: [2, 3], 2: [4, 5, 6], 3: [7, 8]} 因此,2是[1]的下游,4是[1和2]的下游,7是[1,3]的下游 具有挑战性的部分是,我不想确定所有键和值的关系,因为这需要很长时间。对于水文支流的大型数据集,这取决于起始位置,如果收集并确定所有关键点的上游值,这可能

我正在尝试创建一种在的数据帧中交换键和值的方法,但只交换特定子集的键和值。我的整个数据帧大约有500000行长,所以我只想对与初始值相关的键、值对执行此操作

假设数据帧/字典的结构为“上游”和“下游”:

{1: [2, 3], 2: [4, 5, 6], 3: [7, 8]}
因此,2是[1]的下游,4是[1和2]的下游,7是[1,3]的下游

具有挑战性的部分是,我不想确定所有键和值的关系,因为这需要很长时间。对于水文支流的大型数据集,这取决于起始位置,如果收集并确定所有关键点的上游值,这可能会导致创建一个数据帧,该数据帧会随着关键点爆炸

在一天结束时,当提供一个密钥时,我希望返回所有上游密钥。展开所有值类似于:

{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)
def获取上游流域(流域数据帧,流域id):
上游_掩码=盆地数据帧['NEXT_DOWN']==盆地id
iter_上游=盆地数据帧[上游掩码]['HYBAS_ID']
返回iter_上游
盆地编号=
df=pd.read\U csv(表)
行id=df['HYBAS\u id']==盆地id
#一些代码使用区域对潜在子盆地的数量进行子集划分
主池id=df[行id]['main\u BAS']
主池掩码=df['main\u BAS']==主池id.值[0]
主水池\u df=df[主水池\u面罩]
所有流域=列表(主流域[row_id]['HYBAS_id']值)
对于所有_盆地中的b:
tmp=获取上游水流域(主流域df,b)
如果是len(tmp):
所有盆地延伸(tmp值)

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

描述您试图计算的内容可能会有所帮助。如果你有一个盆N,你试图计算。。。所有上游流域?比如说,如果你在一个特定的盆地中发现了受污染的水,你想计算一个潜在来源的列表吗?在抽象的数字和数据结构中很容易迷失方向。我认为树型数据结构在这里可能是最好的,尽管在我脑海中我无法给出这种情况的示例实现。这样,您只需从树叶上穿过,而不需要任何额外的路径。问题是您现在拥有的数据结构迫使您迭代整个dict,以检查每个dict中的成员资格value@Leonid是的,这正是我想弄明白的。一旦我有了上游流域的ID,我就会查询最终溶解/合并的几何图形,以返回上游区域的形状文件。@C.Nivs你说得对。与我交谈过的大多数人都认为迭代是唯一的前进之路。我想知道在这一点上,是否可能有一些优化利用熊猫可能。@Leonid我认为这只是额外的信息。这应该只需要直接下游,这将使迭代更加简单,成员资格测试也不那么棘手:
{1:[2,3],2:[4,5,6],3:[5,6,7,8]}
。不确定数据是否需要额外的转换才能发生