Python 3.x 在pandas中获取非结构化的df列表,并在两列中给出数据结构

Python 3.x 在pandas中获取非结构化的df列表,并在两列中给出数据结构,python-3.x,pandas,Python 3.x,Pandas,我从网上下载数据并将其存储在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 Ar

我从网上下载数据并将其存储在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]


您可以使用
str.extract
dropna()
然后是
drop\u duplicates

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

有关正则表达式模式的详细信息,请粘贴
模式的值

您可以使用
str.extract
dropna()
然后粘贴
drop\u duplicates

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

有关正则表达式模式的详细信息,请粘贴
pattern的值

到目前为止我在这方面使用的代码是:url=”“html=urllib.request.urlopen(url).read()soup=beautifulsou(html)table=soup.find_all('table')[6]df=pd.read_html(str(table))df不要在注释中放置代码。你可以点击下面的问题并用代码更新它。我目前使用的代码是:url=”“html=urllib.request.urlopen(url.read()soup=beautifulsou(html)table=soup.find_all('table')[6]df=pd.read_html(str(table))df不要在注释中放置代码。您可以单击问题下方的,并用代码更新。Quang,谢谢您的回答。当我尝试你提到的代码时,我得到一个属性错误,因为df包含在一个列表中。所以,AttributeError:'list'对象没有属性'stack',啊,它是一个列表。你标记了熊猫,所以我假设它是一个数据帧。也许可以用
df[0]
替换
df
?这样就行了!但只针对第一个值。美国105@kdbaseball8将图案中的空格替换为
\s+
。请参阅update.Quang,感谢您的回复。当我尝试你提到的代码时,我得到一个属性错误,因为df包含在一个列表中。所以,AttributeError:'list'对象没有属性'stack',啊,它是一个列表。你标记了熊猫,所以我假设它是一个数据帧。也许可以用
df[0]
替换
df
?这样就行了!但只针对第一个值。美国105@kdbaseball8将图案中的空格替换为
\s+
。请参阅更新。