Возьмите неструктурированный список df в пандах и предоставьте структуру данных в двух столбцах - PullRequest
1 голос
/ 10 июля 2019

Я скачал данные из Интернета и сохранил их в формате df. Я новичок в Python, поэтому некоторые термины могут быть неправильно указаны.

df ниже:


0   1   2   3
0   United States (105) United States (105) United States (105) United States (105)
1   NaN Alabama (0) Louisiana (2)   Ohio (4)
2   NaN Alaska (0)  Maine (0)   Oklahoma (0)
3   NaN Arizona (0) Maryland (2)    Oregon (0)
4   NaN Arkansas (0)    Massachusetts (9)   Pennsylvania (28)
5   NaN California (0)  Michigan (1)    Rhode Island (0)
6   NaN Colorado (0)    Minnesota (0)   South Carolina (0)
7   NaN Connecticut (3) Mississippi (0) South Dakota (0)
8   NaN Delaware (1)    Missouri (1)    Tennessee (0)
9   NaN Florida (0) Montana (0) Texas (0)
10  NaN Georgia (0) Nebraska (0)    Utah (0)
11  NaN Hawaii (0)  Nevada (0)  Vermont (0)
12  NaN Idaho (0)   New Hampshire (0)   Virginia (1)
13  NaN Illinois (2)    New Jersey (7)  Washington (0)
14  NaN Indiana (0) New Mexico (0)  Washington, D.C. (3)
15  NaN Iowa (2)    New York (36)   West Virginia (0)
16  NaN Kansas (0)  North Carolina (1)  Wisconsin (0)
17  NaN Kentucky (2)    North Dakota (0)    Wyoming (0)
18  Additional Countries / Territories  Additional Countries / Territories  Additional Countries / Territories  Additional Countries / Territories
19  NaN Canada (1)  Germany (1) Unknown (3)
20  NaN England (5) Ireland (6) NaN

Как видите, данные находятся в списке и очень неструктурированы. Я хочу сделать данные в два столбца. Один с заголовком «location», в котором находятся названия штатов и стран, и один с именем «number», в котором находится номер в (). Я хочу удалить повторяющиеся значения и значения NaN, но я верю, что смогу сделать это, если дать остальное правильное направление.

Я заблудился, как начать.

Спасибо!

Код, используемый до сих пор:

url = "http://www.baseball-almanac.com/players/birthplace.php?y=1876"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html)
table = soup.find_all('table')[6] 
df = pd.read_html(str(table))
df = df[0]

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете обойтись с str.extract и dropna(), за которыми следует drop_duplicates:

pattern = '(?P<Country>[\w\s\.\,]*)\s+\((?P<value>\d+)\)'
(df.stack()
 .str.extract(pattern, expand=True)
 .dropna()
 .drop_duplicates()
)

Дает (только голова):

            Country value
0  0   United States   105
1  1         Alabama     0
   2       Louisiana     2
   3            Ohio     4
2  1          Alaska     0
   2           Maine     0
   3        Oklahoma     0
3  1         Arizona     0
   2        Maryland     2
   3          Oregon     0
4  1        Arkansas     0
   2   Massachusetts     9
   3    Pennsylvania    28
5  1      California     0

Подробнее о регулярном выражениишаблон, вставьте значение pattern здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...