熊猫将名称和IP对齐到两个不同的列中

时间:2019-07-15 06:46:31

标签: python-3.x pandas

我具有以下格式的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

1 个答案:

答案 0 :(得分:2)

格式非常不常见,因此可能的解决方案是使用read_csv并除以{,然后进行后期处理-首先将第一列中带有forwarders的值转换为缺失值,然后将其向前填充,在第二列中通过Series.str.stripSeries.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