我有以下格式的資料框(使用體育資料):
| 團隊 | 播放器 | 日期 | 游戲ID |
|---|---|---|---|
| 熊 | 約翰 | 2022-10-01 | A1 |
| 熊 | 戴夫 | 2022-10-01 | A1 |
| 熊 | 史蒂夫 | 2022-10-01 | A1 |
| 公牛隊 | 康納 | 2022-10-01 | C2 |
| 公牛隊 | 杰克 | 2022-10-01 | C2 |
| 熊 | 約翰 | 2022-10-03 | A3 |
基本上,我希望能夠按球隊名稱和日期進行排序,并添加一個名為GameNum的列,該列根據本賽季的比賽數從 1 計數到 82(每支球隊的資料集中有 82 場比賽),如下所示:
| 團隊 | 播放器 | 日期 | 游戲ID | 游戲編號 |
|---|---|---|---|---|
| 熊 | 約翰 | 2022-10-01 | A1 | 1 |
| 熊 | 戴夫 | 2022-10-01 | A1 | 1 |
| 熊 | 史蒂夫 | 2022-10-01 | A1 | 1 |
| 公牛隊 | 康納 | 2022-10-01 | C2 | 1 |
| 公牛隊 | 杰克 | 2022-10-01 | C2 | 1 |
| 熊 | 約翰 | 2022-10-03 | A3 | 2 |
我可以通過獲取每個獨特團隊的子資料框,按比賽日期排序,然后添加一個從 1 到 82 的迭代器值,然后合并每個團隊的結果來手動執行此操作,但我想知道是否有一個“清潔工” 在不訴諸 for 回圈和基于團隊的聯合的情況下做到這一點的方法。
uj5u.com熱心網友回復:
這是一種方法
#create a dictionary of GameNum, with key being the index of the dataframe
d=dict(df.loc[~df.duplicated(subset=['Team','Date'])] # choose unique Team and Date
.groupby(['Team'], as_index=False) # groupby Team
.cumcount() 1) # create a count of Game
# map game number to Game based on index
df['GameNum']=df.index.map(d)
# ffill null values
df['GameNum'].ffill(inplace=True)
# convert game num to int
df['GameNum']=df['GameNum'].astype(int )
df
Team Player Date GameID GameNum
0 Bears John 2022-10-01 A1 1
1 Bears Dave 2022-10-01 A1 1
2 Bears Steve 2022-10-01 A1 1
3 Bulls Connor 2022-10-01 C2 1
4 Bulls Jack 2022-10-01 C2 1
5 Bears John 2022-10-03 A3 2
uj5u.com熱心網友回復:
您也可以嘗試以下方法:
df["GameNum"] = (
df.groupby("Team")["Date"]
.transform(lambda grp: grp.rank(numeric_only=False, method="dense"))
.astype(int)
)
輸出:

uj5u.com熱心網友回復:
我不太確定您想要更清潔的手動方面,但您可以嘗試以下解決方案來完成您的任務。
它為您的問題提供了基本設定 - 我唯一更改的是資料列,它現在被命名為“值”并包含字串值。
import pandas as pd
data = {'team':["bears", "bears", "bears", "bulls", "bulls", "bears"], 'value':["a", "a", "a", "a", "c", "b"]}
df = pd.DataFrame(data, columns = ["team", "value"])
df_grouped = df.groupby('team')
df_team_list = [df_grouped.get_group(x) for x in df_grouped.groups]
df_team_list_with_game_num = list()
for df_team in df_team_list:
df_sorted = df_team.sort_values(by=["value"])
unique_values = df_sorted["value"].unique()
game_num_map = dict()
for i, value in enumerate(unique_values):
game_num_map[value] = i
df_sorted["game_num"] = df_sorted["value"].apply(lambda x: game_num_map[x])
df_team_list_with_game_num.append(df_sorted)
df_with_game_num = pd.concat(df_team_list_with_game_num)
print(df_with_game_num)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519462.html
標籤:Python熊猫数据框
