Comment construire et remplir pandas dataframe de For loop?

Voici un exemple simple du code que je cours, et je voudrais que les résultats soient placés dans un dataframe pandas (à moins qu'il n'y ait une meilleure option):

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

En utilisant ce code:

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

pd.DataFrame(d)

Je peux obtenir:

    Passer Rating   Player      Team
  0 55.8            A.Rodgers   GB

Qui est un dataframe 1x3, et je comprends pourquoi ce n'est qu'une ligne mais je ne peux pas comprendre comment le rendre multi-ligne avec les colonnes dans le bon ordre. Idéalement, la solution serait capable de traiter N Nombre de lignes (basé sur p) et il serait merveilleux (mais pas indispensable) si le nombre de colonnes seraient fixées par le nombre de statistiques demandées. Toutes les suggestions? Merci à l'avance!

23
demandé sur c.j.mcdonn 2015-01-21 01:17:35

3 réponses

Essayez ceci en utilisant la compréhension de liste:

d = df[[p, p.team, p.passing_att, p.passer_rating()] for p in game.players.passing()]
17
répondu Amit 2015-01-21 01:59:54

La réponse la plus simple est ce que Paul H a dit:

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

pd.DataFrame(d)

Mais si vous voulez vraiment "construire et remplir un dataframe à partir d'une boucle", (ce que, btw, Je ne recommanderais pas), voici comment vous le feriez.

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])
41
répondu Nick Marinakis 2015-01-21 01:44:32

Faites une liste de tuples avec vos données, puis créez un DataFrame avec elle:

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

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

Une liste de tuples devrait avoir moins de frais généraux qu'une liste de dictionnaires. J'ai testé ceci ci-dessous, mais n'oubliez pas de donner la priorité à la facilité de compréhension du code par rapport aux performances dans la plupart des cas.

Fonctions de Test:

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)

Résultats:

%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
13
répondu Seanny123 2017-11-30 22:03:42