我正在嘗試制作一個 Champions League Fantasy 統計表,并且我從 2 個不同的站點獲取資料,這些站點的名稱彼此之間略有不同。
我df1來自站點 1:
name age team skill cost gls ast
0 Lionel Messi 34-175 Paris 4 11.3 5 0
1 Ryan Gravenberch 19-214 Ajax 3 6.2 0 0
2 Junior Messias 30-217 Milan 3 6.5 1 0
3 Kepa Arrizabalaga 27-074 Chelsea 1 5.0 0 0
4 Kenneth Taylor 19-214 Ajax 3 5.0 0 0
5 Alisson 30-320 Liverpool 1 6.1 0 0
而df2從現場2:
name age team gls ast
0 Kepa 27-074 Chelsea 0 0
1 Lionel 34-175 Paris 5 0
2 Junior 30-217 Milan 1 0
3 Kenneth 19-214 Ajax 0 0
4 Neymar 29-314 Paris 0 0
5 Ryan 19-214 Ajax 0 0
我的目標是根據多個條件匹配名稱:
- 年齡(字串輸入
df2等于字串輸入df1) - 團隊(字串輸入
df2等于字串輸入df1) - 名稱(字串 in
df2包含在字串 in 中df1)
我想把這個名字作為最后一個條件的原因是因為有兩個球員出生在同一天,并為同一支球隊效力,比如肯尼斯泰勒和瑞恩格雷文伯奇
我在想這樣的事情:
df2.loc[(df2['team'] == df1['team']) & (df2['age'] == df1['age']) & (df2['name'].str.contains(df1['name'].str)), 'name'] = df1['name']
但我收到此錯誤:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
的愿望輸出df2是:
name age team gls ast
0 Kepa Arrizabalaga 27-074 Chelsea 0 0
1 Lionel Messi 34-175 Paris 5 0
2 Junior Messias 30-217 Milan 1 0
3 Kenneth Taylor 19-214 Ajax 0 0
4 Neymar 29-314 Paris 0 0
5 Ryan Gravenberch 19-214 Ajax 0 0
df2與條件匹配的所有名稱都替換為來自df1
uj5u.com熱心網友回復:
使用它來獲得您想要的答案。不再需要基于名稱的單獨條件。
df2.loc[(df2['team'] == df1['team']) & (df2['gls'] == df1['gls']), 'name'] = df1['name']
uj5u.com熱心網友回復:
嘗試merge:
matches = df2.merge(df1[["name", "age", "team"]],
on=["age", "team"],
how="left")
matches["name_y"] = matches["name_y"].fillna(matches["name_x"])
matches = matches.where(matches.apply(lambda x: x["name_x"] in x["name_y"], axis=1)).dropna()
output = matches.drop("name_x", axis=1).rename(columns={"name_y": "name"}).reindex(df2.columns, axis=1)
>>> output
name age team gls ast
0 Kepa Arrizabalaga 27-074 Chelsea 0.0 0.0
1 Lionel Messi 34-175 Paris 5.0 0.0
2 Junior Messias 30-217 Milan 1.0 0.0
4 Kenneth Taylor 19-214 Ajax 0.0 0.0
5 Neymar 29-314 Paris 0.0 0.0
6 Ryan Gravenberch 19-214 Ajax 0.0 0.0
uj5u.com熱心網友回復:
(i)df2從右邊合并到df1onage和team。
(ⅱ)指定名稱中df2而不是在df1與name從塔df1(這是name_x)。
(iii) 過濾掉與跨name_x和name_y列不匹配的名稱并洗掉name_y。
df3 = df1[['name','age','team']].merge(df2, on=['age','team'], how='right')
mask = pd.isna(df3['name_x'])
df3.loc[mask,'name_x'] = df3.loc[mask,'name_y'].to_numpy()
df3 = df3[df3.apply(lambda x: x['name_y'] in x['name_x'], axis=1)].drop('name_y', axis=1)
輸出:
name_x age team gls ast
0 Kepa Arrizabalaga 27-074 Chelsea 0 0
1 Lionel Messi 34-175 Paris 5 0
2 Junior Messias 30-217 Milan 1 0
4 Kenneth Taylor 19-214 Ajax 0 0
5 Neymar 29-314 Paris 0 0
6 Ryan Gravenberch 19-214 Ajax 0 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386234.html
標籤:Python 熊猫 数据框 jupyter-笔记本
