У меня есть файл данных pandas, содержащий данные 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
... ...
Затем, возможно, выполните транспонирование и сопоставьте столбец данных с полями.
Как получить этот результат?
inetnum netname ... source
ip range 1 net name 1 ... source name 1
ip range 2 net name 2 ... source name 1
Попробуй это.
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