Разбор Python списка в pandas .DataFrame с ключевыми словами - PullRequest
0 голосов
/ 19 марта 2020

У меня есть список стран, которые должны превратиться в DataFrame. Проблема в том, что каждая страна и данные - это отдельное слово в списке. Пример:

[
 'Viet',
 'Nam',
 '0',
 '12.3',
 '0',
 'Brunei',
 'Darussalam',
 '12',
 '1.1',
 '0',
 'Bosnia',
 'and',
 'Herzegovina',
 '2',
 '2.1',
 '0',
 'Not',
 'applicable',
 'Turkey',
 '4',
 '4.3',
 '0',
 'Only',
 'partial',
 'coverage'
...
]

Как преобразовать это в: [['' Вьетнам ',' 0 ', '12 .3', '0'], ['Бруней-Даруссалам', '12', '1.1' , ...], ...] или `pd.DataFrame:

             country  coef1  coef2  grade
0           Viet Nam      0   12.3      0
1  Brunei Darussalam     12    1.1      0

ПРИМЕЧАНИЕ: В некоторых странах есть одно слово, например Китай, Франция, или три или более слов, например, Republi c из Кореи. Также, иногда после этой серии номера может быть замечание.

1 Ответ

1 голос
/ 19 марта 2020

Попробуйте:

Где data_in - данные, которые вы хотите проанализировать, а стран - список все страны мира

import pandas as pd
import re

countries = ["Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "Antigua and Barbuda", "Argentina", "Armenia" ...]

data_in = [
    'Viet', 'Nam', '0', '12.3', '0', 'Brunei', 'Darussalam', '12', '1.1', '0', 'Bosnia', 'and', 'Herzegovina', '2', '2.1', '0', 'Not', 'applicable', 'Turkey', '4', '4.3', '0'
]

data_out = []

country = coef1 = coef2 = grade = []

def is_country(elem):
  isCountry = False
  for country in countries:
    if elem.lower() in country.lower():
      isCountry = True
      break
  return isCountry

def is_num(elem):
  if re.search(r'\d', elem) is not None:
    return True
  else:
    return False

idx = 0
while idx < (len(data_in)):
  elem = data_in[idx]
  country = ''
  elements = []
  is_country_name = False
  data_out_local = []
  if is_country(elem):
    #
    while (not is_num(elem) and idx < len(data_in)):
      country += elem + " "
      idx += 1
      elem = data_in[idx]
    while(is_num(elem) and idx < len(data_in)):
      elements.append(elem)
      idx += 1
      if idx < len(data_in):
        elem = data_in[idx]
    data_out_local.append(country)
    data_out_local.extend(elements)
    data_out.append(data_out_local)
  idx += 1


df = pd.DataFrame(data_out, columns=['country', 'coef1', 'coef1', 'grade'])
print(df)

pandas. Выходные данные кадра:

                   country coef1 coef1 grade
0                Viet Nam      0  12.3     0
1  Bosnia and Herzegovina      2   2.1     0
2                  Turkey      4   4.3     0

Нестандартное решение, но оно работает

...