我有一個 Pandas 資料框df,其中詳細說明了玩游戲的玩家的姓名。資料框有 2 列他們玩游戲的“日期”和他們的名字,按日期排序。
| 日期 | 姓名 |
|---|---|
| 1993-03-28 | 湯姆 |
| 1993-03-28 | 喬 |
| 1993-03-29 | 湯姆 |
| 1993-03-30 | 喬 |
我想要完成的是高效地計算每個玩家在當天玩即將到來的游戲之前玩過的游戲數量。
對于上面的示例資料框,計算玩家之前的游戲數量將從 0 開始,如下所示。
| 日期 | 姓名 | 以前的游戲 |
|---|---|---|
| 1993-03-28 | 湯姆 | 0 |
| 1993-03-28 | 喬 | 0 |
| 1993-03-29 | 湯姆 | 1 |
| 1993-03-30 | 喬 | 1 |
我嘗試了以下代碼,盡管它們提供了正確的結果,但我的計算機需要很多天才能運行。
嘗試1:
for i in range(0, len(df) ):
df['Previous Games'][i] = len( df[ (df['Name'] == df['Name'][i]) & (df['Date'] < df['Date'][i]) ] )
嘗試2:
df['Previous Games'] = [ len( df[ (df['Name'] == df['Name'][i]) & (df['Date'] < df['Date'][i]) ] ) for i in range(0, len(df) ) ]
盡管嘗試 2 稍微快了一點,但它仍然不省時,所以我需要幫助來尋找更快的方法。
uj5u.com熱心網友回復:
任何時候你把“for”和“pandas”寫在一起,你可能做錯了什么。
在我看來,您想要累積計數:
df["prev_games"] = df.sort_values('Date').groupby('Name').cumcount()
uj5u.com熱心網友回復:
是的,一種更快的方法應該是避免顯式的 for 回圈。您可以對每個名稱的資料框進行分組,然后.rank按“日期”對行進行分組:
>>> df["Previous Games"] = df.groupby("Name")["Date"].rank("dense") - 1
添加 -1 以從 0 開始。
uj5u.com熱心網友回復:
這是一個熊貓問題,而不是 python 問題。
在處理 pandas 資料幀時,有幾個選項可以避免 for 回圈。最直接的是以下一個:
# To recreate a dummy dataset:
se = pd.date_range(start='2016-01-01', end='2020-12-31', freq='D')
df = pd.DataFrame({"Date": se, "Name": list(np.random.choice(("joe", "bob", "alice"), len(se)))})
# To add the previous games column
df['Previous Games'] = df.apply(lambda row: ((row["Date"] > df["Date"]) * (row["Name"] == df["Name"])).sum(), axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/437081.html
