<h2>提取身份证</h2>
<pre><code>ids = ['Building_id', 'Floor_id', 'Room_id', 'Resource_id']
labels = ['ResID', 'Building', 'Floor', 'Room', 'Resource']
df2 = df.join(pd.DataFrame(list(df['ResID'].str.split('.')), columns=ids))
</code></pre>
<blockquote>
<pre><code> df2
</code></pre>
</blockquote>
<pre><code> ResID Building Floor Room Resource Building_id Floor_id Room_id Resource_id
0 1.1.1.1 Central Park Ground Admin Office Router 1 1 1 1
1 1.1.2.1 Central Park Ground Machine Closet Router 1 1 2 1
2 1.3.1.1 Central Park Mezzanine Dungeon Whip 1 3 1 1
3 2.1.3.1 Chicago Roof Pidgeon Nest Weathervane 2 1 3 1
4 1.13.4.1 Central Park Secret/Hidden Floor c:\room Site-to-site VPN for 1.1.1.1 1 13 4 1
5 1.2.1.1 Central Park Balcony Restroom TP 1 2 1 1
</code></pre>
<h2>重复这个</h2>
<p>小助手方法</p>
<pre><code>def pop_list(list_):
while list_:
yield list_[-1], list_.copy()
list_.pop()
for (id_, remaining_ids), (label, remaining_labels) in zip(pop_list(ids), pop_list(labels)):
print(label, ': ', df2.groupby(remaining_ids)[label].first())
</code></pre>
<p>退货</p>
<pre><code>Resource : Building_id Floor_id Room_id Resource_id
1 1 1 1 Router
2 1 Router
13 4 1 Site-to-site VPN for 1.1.1.1
2 1 1 TP
3 1 1 Whip
2 1 3 1 Weathervane
Name: Resource, dtype: object
Room : Building_id Floor_id Room_id
1 1 1 Admin Office
2 Machine Closet
13 4 c:\room
2 1 Restroom
3 1 Dungeon
2 1 3 Pidgeon Nest
Name: Room, dtype: object
Floor : Building_id Floor_id
1 1 Ground
13 Secret/Hidden Floor
2 Balcony
3 Mezzanine
2 1 Roof
Name: Floor, dtype: object
Building : Building_id
1 Central Park
2 Chicago
Name: Building, dtype: object
</code></pre>
<h2>解释</h2>
<pre><code>for (id_, remaining_ids), (label, remaining_labels) in zip(pop_list(ids), pop_list(labels)):
print((id_, remaining_ids), (label, remaining_labels))
</code></pre>
<p>退货</p>
<pre><code>('Resource_id', ['Building_id', 'Floor_id', 'Room_id', 'Resource_id']) ('Resource', ['ResID', 'Building', 'Floor', 'Room', 'Resource'])
('Room_id', ['Building_id', 'Floor_id', 'Room_id']) ('Room', ['ResID', 'Building', 'Floor', 'Room'])
('Floor_id', ['Building_id', 'Floor_id']) ('Floor', ['ResID', 'Building', 'Floor'])
('Building_id', ['Building_id']) ('Building', ['ResID', 'Building'])
</code></pre>
<p>所以这只是在建筑结构的不同层次上迭代</p>
<pre><code>res = df2.groupby(remaining_ids)[label].first()
</code></pre>
<p>在结构中按级别生成一个数据帧,表示此级别的项,并将嵌套ID作为(多)索引添加到此级别。这是最终数据结构所需的信息,只需将其转换为嵌套的<code>dict</code></p>
<pre><code>Building_id Floor_id
1 1 Ground
13 Secret/Hidden Floor
2 Balcony
3 Mezzanine
2 1 Roof
</code></pre>
<h2>到文本(无嵌套)</h2>
<pre><code>res.index = res.index.to_series().apply('.'.join)
print(res)
</code></pre>
<blockquote>
<pre><code>1.1 Ground
1.13 Secret/Hidden Floor
1.2 Balcony
1.3 Mezzanine
2.1 Roof
Name: Floor, dtype: object
</code></pre>
</blockquote>