考慮一個重塑/支點的解決方案爲您的數據是在寬格式,但你需要對值進行比較在行長格式。所以,第一melt數據,以便所有的列標題成爲一個實際的列'Player'
及其相應的值來'IsInLineup'
。針對虛擬值運行條件比較,然後通過列標題中的玩家轉回到原始結構。當然,我沒有實際的數據來完全測試這個例子。
# MELT
reshapedf = pd.melt(df, id_vars=['Opponent', 'Lineup', 'Minutes', 'Plus Minus',
'Plus Minus Per Minute', 'Opp Lineup'],
var_name='Player', value_name='IsInLineup')
# APPLY FUNCTION (SPLITTING VALUE AND THEN JOINING FOR SUBSET STRING)
reshapedf['IsInLineup'] = reshapedf.apply(lambda row: (' '.join(row['Player'].split(' ')[:2]) in row['Opp Lineup'] and
' '.join(row['Player'].split(' ')[2:]) in row['Opponent'])*1, axis=1)
# PIVOT (UNMELT)
df2 = reshapedf.pivot_table(index=['Opponent', 'Lineup', 'Minutes', 'Plus Minus',
'Plus Minus Per Minute', 'Opp Lineup'], columns='Player').reset_index()
df2.columns = df2.columns.droplevel(0).rename(None)
df2.columns = df.columns
如果上述lambda函數看起來有點複雜,嘗試相當於施加已定義的函數():
# APPLY FUNCTION (SPLITTING VALUE AND THEN JOINING FOR SUBSET STRING)
def f(row):
if (' '.join(row['Player'].split(' ')[:2]) in row['Opp Lineup'] and \
' '.join(row['Player'].split(' ')[2:]) in row['Opponent']):
return 1
else:
return 0
reshapedf['IsInLineup'] = reshapedf.apply(f,axis=1)
爲了幫到你,你就必須提供與期望的結果一個實際的例子據幀,並解釋你有什麼到目前爲止已經試過...... – IanS
這是從Spyder的可變資源管理器的屏幕截圖。期望的結果是能夠遍歷Opp Lineup(大約220列)右側的所有列中的每個值,並且能夠訪問列標題以及對手中相同索引的值以及陣容/ Opp陣容列。我嘗試過使用iterrows,itertuples,interitems來循環以不同的方式 – John