2015-01-20 122 views
11

這裏是我運行代碼的一個簡單的例子,我想投入到大熊貓數據框的結果(除非有更好的選擇):如何構建和填充for循環的熊貓數據框?

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 

這是一個1×3的數據幀,我理解爲什麼只有一個行,但我無法弄清楚如何按照正確的順序使列成多行。理想情況下,解決方案將能夠處理n行數(基於p),如果列數將由請求的統計數量設置,那將是美妙的(雖然不是必需的)。有什麼建議麼?提前致謝!

+0

你在每次迭代覆蓋您的列表,而不是附加 – 2015-01-20 23:03:07

+0

好吧,我明白了什麼是錯的,問題是,我可以不知道如何使它正常工作。這是我能得到的最接近的。 – 2015-01-21 01:24:56

+0

下面的答案將起作用。您也可以在循環中執行'd.append({'Player':...})''。列表中的Python文檔非常好。 – 2015-01-21 01:26:32

回答

15

試試這個使用列表理解:

d = df[[p, p.team, p.passing_att, p.passer_rating()] for p in game.players.passing()] 
+0

謝謝!有一個小的語法錯誤(第一次結束)是在結束,而不是之前),但你讓我在正確的軌道上,我真的很感激它! – 2015-01-21 01:44:32

+0

開箱,這使我儘可能接近我正在尋找的正確順序的列,但是我對python或pandas沒有足夠的瞭解來說明它是否是_best_答案。感謝大家的幫助。 – 2015-01-21 01:53:02

30

最簡單的答案就是保羅ħ說:

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]) 
+0

是否最好將字典添加到列表中,並且由於性能優越或可讀性更好而僅在末尾創建'df'? – 2015-08-18 14:16:13

+1

表現。引用[docs](http://pandas.pydata.org/pandas-docs/version/0.16.2/merging.html#concatenating-objects):...'concat'(因此是'append')數據的完整副本,並且...不斷重複使用此功能可以產生顯着的性能影響。 – 2015-08-20 07:11:49

+0

@NickMarinakis:我不明白你的評論:'如果你真的想「從循環中構建並填充數據框」,(其中,我不會推薦)'。那麼如果不通過循環,你還可以如何構建數據框? – stackoverflowuser2010 2017-08-03 21:06:07

5

讓您的數據元組列表,然後創建一個數據幀與它:

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