如何使用Pandas对含IP地址列的CSV文件正确排序?
按IP地址正确排序CSV数据的解决方法
针对你遇到的IP排序问题,这里提供两种可靠的pandas解决方案,确保IP按四段十进制规则升序排列,同时同步MAC、ID等关联数据:
方法一:使用ipaddress模块(推荐)
利用Python内置的ipaddress模块将IP字符串转换为IPv4对象,这类对象会自动按IP规则比较大小,完美解决排序问题:
import pandas as pd import ipaddress # 读取CSV文件 df = pd.read_csv("your_input.csv") # 按IP地址列排序,key参数通过apply逐个转换IP为IPv4对象 df_sorted = df.sort_values(by="IP Address", key=lambda x: x.apply(ipaddress.IPv4Address)) # 保存排序后的结果(去掉index避免生成多余列) df_sorted.to_csv("sorted_output.csv", index=False)
你之前直接用key=ipaddress.IPv4Address报错,是因为sort_values的key参数需要接收整个Series并返回排序键,而ipaddress.IPv4Address只能处理单个字符串,所以需要用lambda结合apply来逐个转换每个IP值。
方法二:拆分IP为四段整数排序
如果不想依赖ipaddress模块,可以把IP拆分成四个整数列,按多列排序:
import pandas as pd df = pd.read_csv("your_input.csv") # 将IP地址按`.`拆分,生成四个整数列 df[["ip_segment1", "ip_segment2", "ip_segment3", "ip_segment4"]] = df["IP Address"].str.split(".", expand=True).astype(int) # 按四段整数依次升序排序 df_sorted = df.sort_values(by=["ip_segment1", "ip_segment2", "ip_segment3", "ip_segment4"]) # 删除临时生成的拆分列 df_sorted = df_sorted.drop(columns=["ip_segment1", "ip_segment2", "ip_segment3", "ip_segment4"]) # 保存结果 df_sorted.to_csv("sorted_output.csv", index=False)
为什么之前的方法失效?
- 直接用
sort_values()无key参数:会把IP当作普通字符串按字典序排序,导致10.10.10.112排在10.10.10.17前面(字符串比较中"112"的第二个字符'1'小于"17"的'7')。 - 用
sorted()单独排IP列表:只能得到排序后的IP序列,无法同步关联的MAC、ID数据,因为sorted不处理DataFrame的行关联关系。
内容的提问来源于stack exchange,提问作者Amitay Tadmor
相关产品推荐
相关产品推荐

