如何从for循环构建和填充pandas数据帧?

2024-04-28 08:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我正在运行的代码的一个简单示例,我希望将结果放入pandas数据框中(除非有更好的选项):

for p in game.players.passing():
    print p, p.team, p.passing_att, p.passer_rating()

R.Wilson SEA 29 55.7
J.Ryan SEA 1 158.3
A.Rodgers GB 34 55.8

使用此代码:

d = []
for p in game.players.passing():
    d = [{'Player': p, 'Team': p.team, 'Passer Rating':
        p.passer_rating()}]

pd.DataFrame(d)

我可以得到:

    Passer Rating   Player      Team
  0 55.8            A.Rodgers   GB

这是一个1x3数据帧,我理解为什么它只有一行,但我不知道如何使它以正确的顺序排列成多行。理想情况下,该解决方案能够处理n行数(基于p),如果列数由所请求的统计数设置将是非常好的(尽管不是必需的)。有什么建议吗?提前谢谢!


Tags: 数据代码ingameforteamplayerrating
3条回答

最简单的答案是保罗H所说的:

d = []
for p in game.players.passing():
    d.append({'Player': p, 'Team': p.team, 'Passer Rating':
        p.passer_rating()})

pd.DataFrame(d)

但如果你真的想“从循环中构建并填充一个数据帧”(顺便说一句,我不建议这么做),那么你可以这样做。

d = pd.DataFrame()

for p in game.players.passing():
    temp = pd.DataFrame({'Player': p, 'Team': p.team, 'Passer Rating':
        p.passer_rating()})

    d = pd.concat([d, temp])

尝试使用列表理解:

import pandas as pd

df = pd.DataFrame(
    [p, p.team, p.passing_att, p.passer_rating()] for p in game.players.passing()
)

使用数据创建元组列表,然后使用它创建数据帧:

d = []
for p in game.players.passing():
    d.append((p, p.team, p.passer_rating()))

pd.DataFrame(d, columns=('Player', 'Team', 'Passer Rating'))

元组列表的开销应该比列表字典少。我在下面对此进行了测试,但请记住,在大多数情况下,代码理解的容易程度优先于性能。

测试功能:

def with_tuples(loop_size=1e5):
    res = []

    for x in range(int(loop_size)):
        res.append((x-1, x, x+1))

    return pd.DataFrame(res, columns=("a", "b", "c"))

def with_dict(loop_size=1e5):
    res = []

    for x in range(int(loop_size)):
        res.append({"a":x-1, "b":x, "c":x+1})

    return pd.DataFrame(res)

结果:

%timeit -n 10 with_tuples()
# 10 loops, best of 3: 55.2 ms per loop

%timeit -n 10 with_dict()
# 10 loops, best of 3: 130 ms per loop

相关问题 更多 >