在pandas中使用IP地址列对CSV进行排序

at0kjp5o  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(124)

我有一个CSV文件,里面有一列IP地址、MAC地址和其他一些数据
输入:

| IP Address   | MAC Address | ID    |
| ---          | ---         | ---   |
| 10.10.10.1   | {mac1}      | {id1} |
| 10.10.10.112 | {mac2}      | {id2} |
| 10.10.10.17  | {mac3}      | {id3} |
| 10.10.10.7   | {mac4}      | {id4} |

我期望的输出是:

| IP Address   | MAC Address | ID    |
| ---          | ---         | ---   |
| 10.10.10.1   | {mac1}      | {id1} |
| 10.10.10.7   | {mac4}      | {id4} |
| 10.10.10.17  | {mac3}      | {id3} |
| 10.10.10.112 | {mac2}      | {id2} |

其中IP地址与其对应的MAC和ID按正确的升序排列
我试过使用pandas Dataframe.sort_values(),它在没有键的情况下将IP地址以不正确的升序排列,因为它将IP视为整数而不是IP地址。我也试过使用sort_values()和参数key=ipaddress.IPv4Address,但我只得到KeyError

df_new = df.sort_values(df['IP_Address'], key=ipaddress.IPv4Address)

我还尝试了sorted(),它将IP地址以正确的顺序放入列表中,然后当我将其放回 Dataframe 时,它不会对每个IP的相应MAC和ID进行排序

pb3s4cty

pb3s4cty1#

此方法使用Series.str.splitdf.apply()

new_df = (df.sort_values(by=["IP Address"], key=lambda x: x.str.split(".")
               .apply(lambda y: [int(z) for z in y])))
print(new_df)
IP Address MAC Address     ID
0    10.10.10.1      {mac1}  {id1}
3    10.10.10.7      {mac4}  {id4}
2   10.10.10.17      {mac3}  {id3}
1  10.10.10.112      {mac2}  {id2}

相关问题