删除列表Pandas Dataframe列的倒数第二个元素



我有这个问题,我希望能够删除列表的第二个最后一个元素,但保留所有其他元素。

我有这个初始数据帧:

Traceroute_1
-------------------------------------------------------------------
['10.0.11.10', '10.0.1.2', '10.0.12.10', '10.0.12.100']
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.13.10', '10.0.13.100']
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.1.26', '10.0.14.10', '10.0.14.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.5', '10.0.22.10', '10.0.22.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.9', '10.0.23.10', '10.0.23.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.18', '10.0.24.10', '10.0.24.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.23', '10.0.25.10', '10.0.25.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.7.6', '10.0.3.5', '10.0.33.10', '10.0.33.100']

我想在另一个名为"Traceroute_2"的列中获得的结果是这样的:

Traceroute_2
--------------------
['10.0.11.10', '10.0.1.2',  '10.0.12.100']
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.13.100']
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.1.26', '10.0.14.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.5', '10.0.22.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.9', '10.0.23.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.18', '10.0.24.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.23', '10.0.25.100']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.7.6', '10.0.3.5', '10.0.33.100']

正如您所看到的,每个列表的倒数第二个元素都被删除了,但所有其他值都保留了下来。

我试过了:

dfDef1["Traceroute_2"] = [el[:-2] for el in dfDef1["Traceroute_1"]]

但是结果是:

Traceroute_2
----------------------
['10.0.11.10', '10.0.1.2']
['10.0.11.10', '10.0.1.6', '10.0.1.18']
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.1.26']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.9']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.18']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.23']
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.7.6', '10.0.3.5']

这是我的代码

import pandas as pd
dfDef1 = pd.DataFrame({'Traceroute_1':
[
['10.0.11.10', '10.0.1.2', '10.0.12.10', '10.0.12.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.13.10', '10.0.13.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.18', '10.0.1.26', '10.0.14.10', '10.0.14.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.5', '10.0.22.10', '10.0.22.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.9', '10.0.23.10', '10.0.23.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.4.6', '10.0.2.18', '10.0.24.10', '10.0.24.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.2.23', '10.0.25.10', '10.0.25.100'],
['10.0.11.10', '10.0.1.6', '10.0.1.14', '10.0.6.6', '10.0.7.6', '10.0.3.5', '10.0.33.10', '10.0.33.100']
]
})
dfDef1["Traceroute_2"] = [el[:-2] for el in dfDef1["Traceroute_1"]]

这是怎么做到的?

try withseries.strslicing:

dfDef1['Traceroute_2_new'] = (dfDef1['Traceroute_1'].str[:-2] 
+ dfDef1['Traceroute_1'].str[-1:])

el[:-2]取从第一个元素到倒数第二个元素(不包括)的所有元素,而保留其余元素。

试题:

for i in dfDef1["Traceroute_1"]:
i.pop(-2)

在您的脚本中,您选择了从最后一个开始计数的第3个元素。

也许用这个小的改变你的脚本,你设置:

dfDef1["Traceroute_2"] = [el[:-2].extend(el[-1]) for el in dfDef1["Traceroute_1"]]

这将删除列表中倒数第二项:

somelist [: 2] + somelist (len (somelist) 2 + 1:)