Python中数据帧的嵌套列表元素

Python中数据帧的嵌套列表元素,python,pandas,list,Python,Pandas,List,公平警告:这个问题需要一个非标准的Python包,nba\u api。我有一个包含3个元素的列表,列表中的每个元素包含另一个包含2个元素的列表:一个player数据框和一个team数据框。建议采用什么方法来实现以下预期结果:1个组合玩家数据帧和1个组合团队数据帧?我有着R的背景,我将通过以下方式解决这个问题:1。将玩家数据框与团队数据框连接到已加入列表中,然后,2。使用do.call(rbind,joined\u list)将结果行绑定到一个数据帧中。我知道这对于很多有经验的Python用户来说

公平警告:这个问题需要一个非标准的Python包,
nba\u api
。我有一个包含3个元素的列表,列表中的每个元素包含另一个包含2个元素的列表:一个
player
数据框和一个
team
数据框。建议采用什么方法来实现以下预期结果:1个组合<代码>玩家数据帧和1个组合<代码>团队数据帧?我有着R的背景,我将通过以下方式解决这个问题:1。将
玩家
数据框与
团队
数据框连接到
已加入列表
中,然后,2。使用
do.call(rbind,joined\u list)
将结果行绑定到一个数据帧中。我知道这对于很多有经验的Python用户来说可能是非常基本的,但在这里进行了多次搜索之后,我花了很多时间试图找到正确的方法

import nba_api
import requests
import pandas as pd

from nba_api.stats.endpoints import boxscoreadvancedv2

# vector of game ids (test purposes)
gameids = ['0021900001','0021900002','0021900012']

headers1 = {
    'Host': 'stats.nba.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'https://stats.nba.com/',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
}

# store player and team results for each gameids as elements of list temp
temp = list()
for i in range(len(gameids)):
    temp.append(boxscoreadvancedv2.BoxScoreAdvancedV2(game_id = gameids[i], headers=headers1))

# manually access elements of list and output to data frame
## there has to be an easier way to access list elements and rowbind the results!!!
df_out0 = temp[0].get_data_frames()
df_player0 = df_out0[0]
df_team0 = df_out0[1]

df_out1 = temp[1].get_data_frames()
df_player1 = df_out1[0]
df_team1 = df_out1[1]
经过更多的阅读(和澄清),我能够将代码的手动部分组合到for循环中,生成一个包含球员数据的列表和一个包含球队数据的列表。然后,使用这篇帖子:我能够将
玩家
团队
列表组合到各自的数据框中

## output player frames
i=0
df_out=[]
df_players=[]
for i in range(len(temp)):
    df_out = temp[i].get_data_frames()
    df_players.append(df_out[0])         # index 0 will always contain player frame

df_players = pd.concat(df_players)
print(df_players)

## output team frames
i=0
df_out=[]
df_team=[]
for i in range(len(temp)):
    df_out = temp[i].get_data_frames()
    df_team.append(df_out[1])            # index 1 will always contain team frame

df_team = pd.concat(df_team)
print(df_team)

首先,祝贺您坚持到底,并自行找到解决方案!:D

评论和提示 您可以直接迭代列表,无需索引
lst_1=[1,2,3,4]
对于范围内的i(len(lst_1)):
印刷品(一)
可以写成

lst_1=[1,2,3,4]
对于lst_1中的项目:
打印(项目)
你真是太棒了 奖励:注意我对变量名所做的更改。有关Python样式的一般参考,请参见

gameids=['002190001'、'002190002'、'002190012']
校长1={
“主持人”:“stats.nba.com”,
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:61.0)Gecko/20100101 Firefox/61.0”,
“Accept':“application/json,text/plain,*/*”,
‘接受语言’:‘en-US,en;q=0.5’,
“Referer”:https://stats.nba.com/',
“接受编码”:“gzip,deflate,br”,
“连接”:“保持活动状态”,
}
#将每个游戏ID的玩家和团队结果存储为列表元素
temp=list()
对于范围内的i(len(gameid)):
临时追加(boxscoreadvancedv2.boxscoreadvancedv2(游戏id=GameID[i],标题=headers1))
可以写成

game_id=['002190001'、'002190002'、'002190012']
api_头={
“主持人”:“stats.nba.com”,
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:61.0)Gecko/20100101 Firefox/61.0”,
“Accept':“application/json,text/plain,*/*”,
‘接受语言’:‘en-US,en;q=0.5’,
“Referer”:https://stats.nba.com/',
“接受编码”:“gzip,deflate,br”,
“连接”:“保持活动状态”,
}
api\U结果=[boxscoreadvancedv2.boxscoreadvancedv2(游戏id=curr\u游戏id,headers=api\u headers)用于游戏id中的curr\u游戏id]
你对同一件事重复了两次 使用前两个技巧,以下是我们的结论:

players_lst=[]
团队(lst)=[]
对于api结果中的电流:
curr\u dfs=curr\u res.get\u data\u frames()
玩家第一次追加(当前dfs[0])
团队第一次追加(当前dfs[1])
玩家df=pd.concat(玩家)
团队df=pd.concat(团队)
我的解决方案 为清晰起见,请将其稍微细分

将熊猫作为pd导入
从nba_api.stats.endpoints.boxscoreadvancedv2导入boxscoreadvancedv2
游戏ID=['002190001','002190002','002190012']
api_头={
“主持人”:“stats.nba.com”,
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:61.0)Gecko/20100101 Firefox/61.0”,
“Accept':“application/json,text/plain,*/*”,
‘接受语言’:‘en-US,en;q=0.5’,
“Referer”:https://stats.nba.com/',
“接受编码”:“gzip,deflate,br”,
“连接”:“保持活动状态”,
}
#来自API的结果生成器
api\U结果=(游戏id中当前游戏id的BoxScoreAdvancedV2(游戏id=curr\u游戏id,标题=api\u标题)
#根据API结果生成数据帧列表
#可以这样想:[[Player DF,Team DF],[Player DF,Team DF],…]
api_res_dfs=(当前_res.获取api_结果中当前_res的数据_帧())
#将大小为2的数据帧列表解压为2个平面列表
#[[Player DF,Team DF],[Player DF,Team DF],…]->[Player DF,Player DF,…],[Player DF,Team DF,…]
#看https://stackoverflow.com/q/2921847/11301900 有关使用星号(*)的详细信息
球员、球队=zip(*api\U res\U dfs)
#连接各种数据帧,与原始代码中完全相同
玩家密度=pd.concat(玩家密度)
团队df=pd.concat(团队)
打印(玩家(df)
打印(团队测向)
这取决于这样一个事实,即不仅如您所指出的,玩家数据框始终是列表中的第一项,团队数据框始终是第二项,而且这是结果列表中仅有的两项



若你们有任何问题,请告诉我:)

你们能提供一组数据吗?这是一个非常好的、高质量的答案!我非常感谢您对我的代码的反馈,因为这是我编写的第一个Python代码。我接受你的回答,因为这是一个更好的回答。非常感谢。对于您的第一个Python程序,这非常强大!你肯定有其他语言的经验,不是吗?还有,你有什么问题吗?有些事情我可能解释得不够好。我的背景是R,所以我肯定有这种经验可以依靠。我对你的回答没有任何疑问。这对我想要实现的目标非常有效。随着我继续学习Python,我肯定会有更多的问题,所以我肯定你会不时看到我提出的一些问题。再次感谢!
# output player frames
i=0
df_out=[]
df_players=[]
for i in range(len(temp)):
    df_out = temp[i].get_data_frames()
    df_players.append(df_out[0])         # index 0 will always contain player frame

df_players = pd.concat(df_players)
print(df_players)

# output team frames
i=0
df_out=[]
df_team=[]
for i in range(len(temp)):
    df_out = temp[i].get_data_frames()
    df_team.append(df_out[1])            # index 1 will always contain team frame

df_team = pd.concat(df_team)
print(df_team)