在python中解析APNIC批量Whois数据

时间:2018-07-02 15:02:19

标签: python pandas dataframe

我有一个包含bulkwhois数据的熊猫数据框,它存储在txt文件中。它包含12,517,501行,在一列中一次又一次地重复几乎相同的信息。所有条目均以“ inetnum”开头,以“ source:source name 1”结尾。两者之间的大多数信息具有相同的信息,但是其中一些信息是乱序的,例如某些条目具有3个描述,而其他条目具有4个描述。例如,另一件事是,第一个条目“ admin-c:admin 1”位于“ descr:description 1”之后,而第二个条目“ admin-c:admin 2”位于“ country:country name 2”之后。 df是单列。以下是前两个条目:

data
inetnum: ip range 1
netname: net name 1
country: country name 1
descr: description 1
descr: description 1
descr: description 1
admin-c: admin 1
tech-c: tech 1
status: status 1
mnt-by: mnt-by 1
mnt-routes: mnt-routes 1
last-modified: last modified 1
source: source name 1
inetnum: ip range 2
netname: net name 2
descr: description 2
descr: description 2
descr: description 2
country: country name 2
admin-c: admin 2
tech-c: tech 2
mnt-by: mnt-by 2
remarks: remarks 2
status: status 2
last-modified: last modified 2
source: source name 1

对于每个条目,我希望输出的内容以“ inetum:”开头并以“ source:source name 1”结尾的内容始终保持相同,格式如下:

inetnum    netname     ...  source
ip range 1 net name 1  ...  source name 1
ip range 2  net name 2  ...  source name 1

我在想是否将一列分成两部分:

apnic2entry2 = pd.DataFrame(apnic2entry.data.str.split(':',1).tolist(),
                       columns = ['field', 'data'])

这给了我一个字段和数据列:

field    data    
inetnum  ip range 1
netname  net name 1
country  country name 1
...      ...

然后可以进行转置并将data列与字段匹配。

如何获得此输出?

inetnum    netname     ...  source
ip range 1 net name 1  ...  source name 1
ip range 2  net name 2  ...  source name 1

1 个答案:

答案 0 :(得分:2)

让我们尝试一下。

df_out = df['data'].str.split(': ', expand=True)
df_out = df_out.set_index([0,(df_out[0] == 'inetnum').cumsum().rename('row')])
df_out = df_out.set_index(df_out.groupby([0,'row']).cumcount(), append=True)
df_out = df_out.reset_index('row')
df_out.index = df_out.index.map('{0[0]}_{0[1]}'.format)
df_out = df_out.set_index(['row'], append=True)[1].unstack(0)
df_out = df_out.rename(columns=lambda x: x.split('_0')[0]).reset_index()
print(df_out)

输出:

   row  admin-c         country          descr        descr_1        descr_2     inetnum    last-modified    mnt-by    mnt-routes     netname    remarks         source    status  tech-c
0    1  admin 1  country name 1  description 1  description 1  description 1  ip range 1  last modified 1  mnt-by 1  mnt-routes 1  net name 1        NaN  source name 1  status 1  tech 1
1    2  admin 2  country name 2  description 2  description 2  description 2  ip range 2  last modified 2  mnt-by 2           NaN  net name 2  remarks 2  source name 1  status 2  tech 2