我的数据框看起来像这样:
nodename ip <otherfields>
amelia 192.168.23.8 <...>
boris 10.8.45.3 <...>
boris 192.168.67.4 <...>
clyde 192.168.45.3 <...>
darwin 192.168.67.4 <...>
ellen 192.168.23.9 <...>
我想通过将所有至少包含我的一个键(在本例中为nodename和ip)的元素组合在一起进行分区,然后依次处理每个'clump。
nodename ip <otherfields>
clump1:
amelia 192.168.23.8 <...>
ellen 192.168.23.8 <...>
clump2:
boris 10.8.45.3 <...>
boris 192.168.67.4 <...>
darwin 192.168.67.4 <...>
clump3:
clyde 192.168.45.9 <...>
请注意,在clump2中,虽然(boris,10.8.45.3)与(darwin,192.168.67.4)没有共同的值,但是它们通过“共同邻居”(boris,192.168.67.4)链接在一起
对于更广泛的上下文,我的实际问题涉及使用4个不同的键对DF进行分区。它需要几个前面的步骤来生成DataFrame(它包含大约10 000行),并且将依次使用几个步骤处理每个'clump'。目前,数据是在一个庞大且笨拙的Excel VBA宏中处理的,它可以对数据进行多次传递,一次拉出一个“丛”。
答案 0 :(得分:0)
后人:
我最终使用以下算法循环遍历我的数据集:
1. Select first unmatched row currently in the dataset and use that to initialise sets of search keys.
2. Iteratively select all rows matching the keys, and rebuild the sets of search keys.
3. When the sets of search keys stabilises, write a marker field so the records are not selected at step 1 of the algorithm.
4. Repeat from step 1.
下面是第2步的代码段。如果所有键组都是空的,它会进入一个无限循环,并且它不像矢量化/ map-reduce /多线程解决方案那样快,但我的计算机可以通过一个20k的数据集来阻塞〜15分钟,这是足够好的&#34;在这个阶段。
i = 0
while not (nodename_set == servername_set_2 and ip_set == ip_set_2):
nodename_set = nodename_set_2
ip_set = ip_set_2
built = all.loc[all['nodename'].isin(nodename_set) | all['ip'].isin(ip_set)]
#build the comparator keys
#the lamba filter purges nans
nodename_set_2 = set(filter(lambda v: v==v, built['nodename']))
ip_set_2 = set(filter(lambda v: v==v, built['ip']))
itcount = itcount + 1
else:
all.loc[all['nodename'].isin(nodename_set) | all['ip'].isin(ip_set), 'groupID'] = i
i = i+1 #i is the groupID counter