python-3.x - 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
解决方案
格式非常罕见,因此可能的解决方案是使用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