过滤后的Pandas对象调用tolist()报错:DataFrame与Series类型混淆
数据对象
"FiveGigabitEthernet1/0/1": { "enabled": true, "data": "10", "voice": "20", "mode": "None", "serviceOutput": "None", "serviceInput": "None", "noMacro": "None", "template": "None", "tracking": "None", "speed": "None", "duplex": "None", "nonnegotiate": "None", "trusted": "None", "channelGroup": "None", "channelProtocol": "None", "ipAddress": "None", "ipMask": "None", "nativeVlan": "None", "allowedVlan": "None" }, "TenGigabitEthernet1/1/1": { "serviceOutput": "POLICY", "channelGroup": "1", "channelProtocol": "active", "nonnegotiate": true, "mode": "trunk", "allowedVlan": ["2", "10", "20", "30"], "nativeVlan": "2", "enabled": true, "data": "None", "voice": "None", "serviceInput": "None", "noMacro": "None", "template": "None", "tracking": "None", "speed": "None", "duplex": "None", "trusted": "None", "ipAddress": "None", "ipMask": "None" }
Pandas初始化代码
unique = r"GigabitEthernet0\/0|Bluetooth|AppGigabitEthernet|TwentyFiveGigE|FortyGigabitEthernet|Vlan" ints = pd.DataFrame.from_dict(dataResult, orient="index") ints.index.name = "port" ints = ints.reset_index() test = ints[(ints["mode"] != "trunk") & (~ints["port"].str.contains(unique,case=False,na=False))] print(test)
问题原因及解决方法
调用.tolist()报错的原因
test是DataFrame类型,并非你误以为的Series。因为ints本身是包含多列的二维数据表,通过布尔索引过滤后,返回的结果依然保留所有列结构,仍是DataFrame。而.tolist()是Series的专属方法,直接在DataFrame上调用会触发类型错误。
获取port列Python列表的方法
要提取port列并转为原生列表,需先选中该列转为Series,再调用列表转换方法,三种常用实现方式:
- 选中列后调用
.tolist():
port_list = test["port"].tolist()
- 选中列后调用
.values.tolist():
port_list = test["port"].values.tolist()
- 使用Pandas推荐的
.to_list()方法(功能与.tolist()一致):
port_list = test["port"].to_list()
针对你的数据,以上方法最终都会得到结果:['FiveGigabitEthernet1/0/1']
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

