列表中的嵌套字符串-需要拆分嵌套字符串以帮助将其转换为数据框

时间:2019-11-30 22:09:22

标签: python dataframe

我正在使用nba统计信息进行网络抓取项目。当我抓取时,我可以获得所有信息。但是,所有统计信息都作为一个字符串返回,该字符串变成一个数据帧,将所有统计信息放在一列中。我正在尝试拆分此字符串。并将其替换为自己的嵌套区域。 希望图像可以更好地解释这一点。

我正在使用硒从https://stats.nba.com/players/traditional/?sort=PTS&dir=-1进行网络爬虫,因为我打算点击所有页面

code I've done so far

这是我正在使用的功能: 在最后一行中,我想用创建的拆分版本替换z [2]。当我尝试z [2] = z [2] .split('')时,出现错误 AttributeError:'list'对象没有属性'split'

new_split = []
for i in player:
    player_stats.append(i.text.split('\n'))
    for z in player_stats:
        new_split.append(z[2].split(' '))```

2 个答案:

答案 0 :(得分:1)

您没有提到要从何处获取数据。(我在代码中更新了uint8。它仍然是相同的API,可为所有对象返回信息457个播放器,因此无需使用硒导航到其他页面)。官方的nba网站似乎正在以JSON格式提供其数据,这在进行网络抓取时总是需要的:

url

输出:

import requests
import json

# url = "https://stats.nba.com/stats/leagueLeaders?LeagueID=00&PerMode=PerGame&Scope=S&Season=2019-20&SeasonType=Regular+Season&StatCategory=PTS"

url = "https://stats.nba.com/stats/leaguedashplayerstats?College=&Conference=&Country=&DateFrom=&DateTo=&Division=&DraftPick=&DraftYear=&GameScope=&GameSegment=&Height=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2019-20&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&TwoWay=0&VsConference=&VsDivision=&Weight="

response = requests.get(url)
response.raise_for_status()

data = json.loads(response.text)

players = []
for player_data in data["resultSet"]["rowSet"]:
    player = dict(zip(data["resultSet"]["headers"], player_data))
    players.append(player)


for player in players[:10]:
    print(f"{player['PLAYER']} ({player['TEAM_ABBREVIATION']}) is rank {player['RANK']} with a GP of {player['GP']}")

注意:我不知道“ GP”是什么-我只是为了演示而选择了它。这是Chrome的网络记录器的屏幕快照,显示了扩展的JSON资源的一小部分( EDIT ),新的James Harden (HOU) is rank 1 with a GP of 18 Giannis Antetokounmpo (MIL) is rank 2 with a GP of 19 Luka Doncic (DAL) is rank 3 with a GP of 18 Bradley Beal (WAS) is rank 4 with a GP of 17 Trae Young (ATL) is rank 5 with a GP of 18 Damian Lillard (POR) is rank 6 with a GP of 18 Karl-Anthony Towns (MIN) is rank 7 with a GP of 16 Anthony Davis (LAL) is rank 8 with a GP of 18 Brandon Ingram (NOP) is rank 9 with a GP of 15 LeBron James (LAL) is rank 10 with a GP of 19 的json响应看起来完全一样,只是其中一些标头不同,例如“ TEAM”->“ TEAM_ABBREVIATION”):

您可以看到这些值-您正在努力从一个巨大的字符串中提取这些值-很好地分成了单独的元素。我上面发布的代码使用标头(在url中找到的标头(“ PLAYER_ID”,“ RANK”等)和这些值创建键值对。

答案 1 :(得分:0)

如果第二列是字符串,则可以尝试将此字符串拆分为 一个列表,将该列表的每个元素转换为一系列,然后进行合并 这个新的数据帧带有原始数据帧的前两列。

df_stats = df["2"].apply(lambda x: x[0].split(" ")).apply(pd.Series)

df_end = pd.concat([df[["0","1"]].reset_index(drop=True), df_stats], axis=1)

示例:

df = pd.DataFrame({"0": [1, 2],
                   "1": ["Name1", "Name2"],
                   "2":[["HOU 30 80"], ["LA 30 50"]]})

df_stats = df["2"].apply(lambda x: x[0].split(" ")).apply(pd.Series)

df_end = pd.concat([df[["0","1"]].reset_index(drop=True), df_stats], axis=1)

    0   1       0   1   2
0   1   Name1   HOU 30  80
1   2   Name2   LA  30  50