Разбор APNIC массовых данных whois в python

1

У меня есть файл данных 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
  • 0
    Что вы хотите сделать с несколькими полями desc, чтобы создать список?
  • 0
    Включите их со всеми другими данными, если это возможно @Scott Boston
Показать ещё 3 комментария
Теги:
pandas
dataframe

1 ответ

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
  • 1
    Это именно то, что я хотел, очень гладко! Спасибо @ Скотт Бостон
  • 0
    @sectechguy Не за что. Удачного кодирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню