我具有以下格式的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
答案 0 :(得分:2)
格式非常不常见,因此可能的解决方案是使用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