回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在努力寻找一些<code>elegant</code>解决方案,从我的数据中获得我需要的东西。我能够得到我想要的,但是通过<code>too much</code>的努力,我相信可以做得更好,这就是我所寻找的</p>
<p>下面是我的数据帧示例</p>
<pre><code>>>> df = pd.DataFrame({'device_name': ['tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1', 'tap_switch_1'], 'interface': ['ethernet3', 'ethernet4', 'ethernet38', 'ethernet7', 'ethernet8', 'ethernet31', 'ethernet1', 'ethernet12', 'ethernet20'], 'tap_port': ['1-tx-a-rx', '1-tx-b-rx', '1-b', '2-tx-a-rx', '2-tx-b-rx', '2-b', '3-tx-a-rx', '3-tx-b-rx', '3-b'], 'switch_name': ['sw_ag1', 'sw_ag1', 'sw_client1', 'sw_ag1', 'sw_ag1', 'sw_client2', 'sw_ag1', 'sw_ag1', 'sw_client3']})
</code></pre>
<h3>当前数据帧形状:</h3>
<pre><code>device_name interface tap_port switch_name
tap_switch_1 ethernet3 1-tx-a-rx sw_ag1
tap_switch_1 ethernet4 1-tx-b-rx sw_ag1
tap_switch_1 ethernet38 1-b sw_client1
tap_switch_1 ethernet7 2-tx-a-rx sw_ag1
tap_switch_1 ethernet8 2-tx-b-rx sw_ag1
tap_switch_1 ethernet31 2-b sw_client2
tap_switch_1 ethernet1 3-tx-a-rx sw_ag1
tap_switch_1 ethernet12 3-tx-b-rx sw_ag1
tap_switch_1 ethernet20 3-b sw_client3
</code></pre>
<h3>我希望得到的理想输出是:</h3>
<pre><code>device_name id agg_switch rx_int tx_int client_switch client_port
tap_switch_1 1 sw_ag1 ethernet3 ethernt4 sw_client1 ethernet38
tap_switch_1 2 sw_ag1 ethernet7 ethernt8 sw_client2 ethernet31
tap_switch_1 3 sw_ag1 ethernet1 ethernt12 sw_client3 ethernet20
</code></pre>
<h3>逻辑</h3>
<p>因此,基本上我有一个网络设置,其中一个交换机用于连接多个接口。对于每个<code>client switch port</code>有两个<code>device_name</code>接口-每个方向一个(RX/TX)。我使用<code>tap_port</code>name将所有这些组合成一个组,基于我看到的第一个整数,它表示“tap_组”</p>
<h3>当前“解决方案”</h3>
<p>这是我现在的做法,我不太清楚,也没有给我<code>desired output</code>:</p>
<pre><code># Add new `id` column
>>> df['id']=df.tap_port.str[0]
# Get RX/TX direction as new column `direction`
>>> df['direction']=df.tap_port.apply(lambda x: x[-4:] if 'x' in x else '-')
# Trying to get the desired output
>>> df.pivot(index='id', columns='direction')[['switch_name','interface']]
switch_name interface
direction - a-rx b-rx - a-rx b-rx
id
1 sw_client1 sw_ag1 sw_ag1 ethernet38 ethernet3 ethernet4
2 sw_client2 sw_ag1 sw_ag1 ethernet31 ethernet7 ethernet8
3 sw_client3 sw_ag1 sw_ag1 ethernet20 ethernet1 ethernet12
</code></pre>
<p>这非常接近我所需要的,但不完全符合<code>desired output</code></p>
<p>非常感谢您的帮助</p>