我有一个包含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
答案 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