2016-02-16 104 views
0

覆蓋特定值I具有的大數據幀整理一束籃球的數據(下圖)。 Opp Lineup右側的每一列都是一個虛擬變量,指示該玩家(在列名中指明)是否在當前陣容中(列名的最後一部分是隊名,需要與對手列進行比較)確保不同團隊中具有相同編號和姓名的兩名球員不會混淆)。我知道通過大熊貓數據框(iterrows,itertuples,iteritems)迭代的幾種方法,但我不知道要做到什麼,我需要,這是在每列線的方式:迭代通過並在大熊貓數據幀

  1. 比較隊(columnname.split()[2:])發送到對手柱(除了LSU玩家)
  2. 查看該名稱(columnname.split()[:2])是奧普陣容,或對於LSU播放器,陣容
  3. 如果上述條件滿足,替換1中的值,否則把它作爲0

enter image description here

什麼是通過數據幀循環,完成這個任務的最佳方法是什麼?在這種情況下速度並不重要。我瞭解所有涉及的邏輯,除了我不熟悉熊貓以知道如何循環播放它,並嘗試我在Google上看到的各種內容無法正常工作。

+0

爲了幫到你,你就必須提供與期望的結果一個實際的例子據幀,並解釋你有什麼到目前爲止已經試過...... – IanS

+0

這是從Spyder的可變資源管理器的屏幕截圖。期望的結果是能夠遍歷Opp Lineup(大約220列)右側的所有列中的每個值,並且能夠訪問列標題以及對手中相同索引的值以及陣容/ Opp陣容列。我嘗試過使用iterrows,itertuples,interitems來循環以不同的方式 – John

回答

0

最後我用一個變通。我通過使用df.iterrows進行迭代,併爲每個迭代創建了一個列表,用於檢查我想要的值,然後將0或1附加到臨時列表中。然後我只是將它插入數據框。可能不是最有效的記憶方式,但它工作。

1

考慮一個重塑/支點的解決方案爲您的數據是在寬格式,但你需要對值進行比較在行長格式。所以,第一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) 
+0

謝謝!我實際上通過創建另一個列表來追加到我的迭代通過每列後迭代通過重置爲空的解決方法。但是,這個答案肯定教會了我在 – John

+0

之前沒有意識到的一些事情,但是好奇的是,這個例子是否工作?您甚至可以考慮維護一個重新構建的長數據格式,因爲實際上大多數分析的處理方式都更好。 – Parfait