首页 > 解决方案 > Pandas 将名称和 IP 对齐到两个不同的列中

问题描述

我有以下格式的 Unix DNS 名称和 IP 地址,我希望它们对齐到两个不同的列中,以便将第一列中的 DNS 服务器名称和第二列中的 IP 分开。

以下是原始数据样本:

 dns1-example
        forwarders { 192.168.11.250; 192.168.11.140; 192.168.11.141; };

 dns2-exampe
        forwarders { 192.168.11.250; 192.168.11.140; 192.168.11.141; };

期望的输出:

  DNS_NAME                  Forwarders_IP
 dns1-example               192.168.11.250 192.168.11.140 192.168.11.141
 dns2-example               192.168.11.250 192.168.11.140 192.168.11.141

标签: python-3.xpandas

解决方案


格式非常罕见,因此可能的解决方案是使用read_csv拆分{然后进行后处理 - 首先将forwarders第一列中的值转换为缺失值并前向填充它们,在第二列中删除不必要的值,Series.str.strip并在第二列中删除Series.str.replace具有缺失值的行列DataFrame.dropna

import pandas as pd

temp=u"""
dns1-example
        forwarders { 192.168.11.250; 192.168.11.140; 192.168.11.141; };

 dns2-exampe
        forwarders { 192.168.11.250; 192.168.11.140; 192.168.11.141; };"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="{", names=['DNS_NAME','Forwarders_IP'])

print (df)
              DNS_NAME                                      Forwarders_IP
0         dns1-example                                                NaN
1          forwarders    192.168.11.250; 192.168.11.140; 192.168.11.14...
2          dns2-exampe                                                NaN
3          forwarders    192.168.11.250; 192.168.11.140; 192.168.11.14...

m = df['DNS_NAME'].str.contains('forwarders', na=False)
df['DNS_NAME'] = df['DNS_NAME'].mask(m).ffill().str.strip()
df['Forwarders_IP'] = df['Forwarders_IP'].str.strip(' };').str.replace(';','')
df = df.dropna(subset=['Forwarders_IP']).reset_index(drop=True)
print (df)
       DNS_NAME                                 Forwarders_IP
0  dns1-example  192.168.11.250 192.168.11.140 192.168.11.141
1   dns2-exampe  192.168.11.250 192.168.11.140 192.168.11.141

推荐阅读