2016-12-17 4 views
1

転置に問題があるデータセット(nba_data)があります。私が欲しいのは、あなたがそれは素晴らしいことだ助けてくださいことができれば、次のようにPython - パンダのガモログデータの転置

TEAM_ABBREVIATION GAME_DATE HomeWin HomeLoss AwayWin AwayLoss 
ATL    2016-10-27  1  0   0  0 
ATL    2016-10-29  1  0   1  0 
ATL    2016-10-31  2  0   1  0 
ATL    2016-11-02  2  1   1  0 
BKN    2016-10-26  0  0   0  1 
BKN    2016-10-28  1  0   0  1 
BKN    2016-10-29  1  0   0  2 
BKN    2016-10-31  1  1   0  2 

を以下、

TEAM_ABBREVIATION GAME_DATE WinLoss HomeAway 
ATL     2016-10-27 W    H 
ATL     2016-10-29 W    A 
ATL     2016-10-31 W    H 
ATL     2016-11-02 L    H 
BKN     2016-10-26 L    A 
BKN     2016-10-28 W    H 
BKN     2016-10-29 L    A 
BKN     2016-10-31 L    H 

を変換することです。

おかげで、トム

答えて

3
import pandas as pd 

df = pd.DataFrame({'GAME_DATE': ['2016-10-27', '2016-10-29', '2016-10-31', '2016-11-02', '2016-10-26', '2016-10-28', '2016-10-29', '2016-10-31'], 'HomeAway': ['H', 'A', 'H', 'H', 'A', 'H', 'A', 'H'], 'TEAM_ABBREVIATION': ['ATL', 'ATL', 'ATL', 'ATL', 'BKN', 'BKN', 'BKN', 'BKN'], 'WinLoss': ['W', 'W', 'W', 'L', 'L', 'W', 'L', 'L']}) 

result = pd.get_dummies(df['HomeAway'] + df['WinLoss']).astype('int') 
result = result.groupby(df['TEAM_ABBREVIATION']).transform('cumsum') 
result = result.sort_index(axis='columns', ascending=False) 
result = result.rename(columns={'AL':'AwayLoss', 'AW':'AwayWin', 
           'HL':'HomeLoss', 'HW':'HomeWin'}) 
result = pd.concat([df[['TEAM_ABBREVIATION', 'GAME_DATE']], result], axis='columns') 

収率

TEAM_ABBREVIATION GAME_DATE HomeWin HomeLoss AwayWin AwayLoss 
0    ATL 2016-10-27  1   0  0   0 
1    ATL 2016-10-29  1   0  1   0 
2    ATL 2016-10-31  2   0  1   0 
3    ATL 2016-11-02  2   1  1   0 
4    BKN 2016-10-26  0   0  0   1 
5    BKN 2016-10-28  1   0  0   1 
6    BKN 2016-10-29  1   0  0   2 
7    BKN 2016-10-31  1   1  0   2 

最初のアイデアは、WinLossからの可能な値の4つの組み合わせに対応する "イベント" の4種類があるということです​​列:(W,H),(W,A),(L,H)および(L,A) 。その後、

In [111]: df['HomeAway'] + df['WinLoss'] 
Out[111]: 
0 HW 
1 AW 
2 HW 
3 HL 
4 AL 
5 HW 
6 AL 
7 HL 
dtype: object 

と1のテーブルと0にこのシリーズを変換するget_dummiesを使用します:

In [112]: pd.get_dummies(df['HomeAway'] + df['WinLoss']).astype('int') 
Out[112]: 
    AL AW HL HW 
0 0 0 0 1 
1 0 1 0 0 
2 0 0 0 1 
3 0 0 1 0 
4 1 0 0 0 
5 0 0 0 1 
6 1 0 0 0 
7 0 0 1 0 

したがって、単一の列にWinLossと​​列を結合したいのが自然です

あなたの希望する結果と比較すると、TEAM_ABBREVIATIONでグループ化された累積合計が表示されます。

In [114]: result.groupby(df['TEAM_ABBREVIATION']).transform('cumsum') 
Out[114]: 
    AL AW HL HW 
0 0 0 0 1 
1 0 1 0 1 
2 0 1 0 2 
3 0 1 1 2 
4 1 0 0 0 
5 1 0 0 1 
6 2 0 0 1 
7 2 0 1 1 

次の2行の並べ替えと列の名前を変更:

result = result.sort_index(axis='columns', ascending=False) 
result = result.rename(columns={'AL':'AwayLoss', 'AW':'AwayWin', 
           'HL':'HomeLoss', 'HW':'HomeWin'}) 

最後に、我々はresultdfを連結し、所望のデータフレーム構築するpd.concatを使用することができます。この `get_dummies`方法を

result = pd.concat([df[['TEAM_ABBREVIATION', 'GAME_DATE']], result], axis='columns') 
+0

をいいです! –