2017-06-29 53 views
1

私はこのようなデータフレームがあります。value_counts()の出力をデータフレームに変換する方法は?

match  team1  team2  winner 
1   MI   KKR  MI 
2   DD   CSK  DD 
3   RCB   DC   RCB..... 

私は計算したいどのようなチームがトーナメントで他のチームに対して勝利した回数です。

MI:10

KKR:KKR対MIのために同様の機能で今

def comparator(team1): mt1=matches[((matches['team1']==team1)|(matches['team2']==team1))] teams=['MI','KKR','RCB','DC','CSK','RR','DD','GL','KXIP','SRH','RPS','KTK','PW'] teams.remove(team1) opponents=teams.copy() for i in opponents: mt2=mt1[(((mt1['team1']==i)|(mt1['team2']==i)))&((mt1['team1']==team1)|(mt1['team2']==team1))].winner.value_counts() print(mt2) comparator('MI') 

MT2:5

だから私はこのような機能を書かれていますは、team1とteam2のそれぞれの勝利に対して正しい値を出力します。出力は次のようになります。

MI  13 
KKR  5 
Name: winner, dtype: int64 
MI  11 
RCB  8 
Name: winner, dtype: int64 

出力は正しくなりましたが、フォーマットは適切ではありません。次の出力をデータフレームに変換したい。

値をリストに追加しようとしましたが、行として機能しません名前:winner、dtype:int64もリストに追加されています。

データフレームに変換するにはどうすればよいですか?

+0

あなたは単にの代わりにDFをしたいわけシリーズ?結果に 'to_frame()'を呼び出す – EdChum

+0

データフレームにはい – user517696

答えて

1

私はあなたが必要だと思う:

列として必要インデックスがSeries.reset_indexを追加する場合:

mask = (((mt1['team1']==i)|(mt1['team2']==i)))&((mt1['team1']==team1)|(mt1['team2']==team1)) 
mt2 = mt1.loc[mask, 'winner'].value_counts().reset_index() 

場合、または必要性Series 1列DataFrameに変換Series.to_frameを追加します。

mask = (((mt1['team1']==i)|(mt1['team2']==i)))&((mt1['team1']==team1)|(mt1['team2']==team1)) 
mt2 = mt1.loc[mask, 'winner'].value_counts().to_frame() 

も優れていますlocboolean maskを使用し、列を定義します。

+0

は完璧に動作しました....ありがとうございました!!! – user517696

+0

喜んで助けることができます!そして、良い一日! – jezrael

0

あなたは今、あなたはすべての結果

をカバーするために1件の巨人 DataFrameを作ることができます

def my_comp(df, team): 
    matches_with_team = df[(df[['team1', 'team2']] == team).any(axis=1)] 
    other_teams = (set(matches_with_team['team1'])^set(matches_with_team['team2'])) - {team} 
    comparison_df = pd.DataFrame(index=other_teams, columns=['wins', 'losses']) 
    comparison_df.index.name = 'opponent' 
    for opponent in other_teams: 
     matches_against_opponents = matches_with_team[(matches_with_team[['team1', 'team2']] == opponent).any(axis=1)] 
     winners = matches_against_opponents['winner'].value_counts().reindex([team, opponent]) 
     # print(winners) 
     comparison_df.loc[opponent] = [winners[team], winners[opponent]] 
    return comparison_df.fillna(0).astype(int) 

my_comp(df, 'MI')

wins losses 
opponent   
KKR  1.0  0 

とにかく検索ビットを簡素化する、またはそれをより読みやすくすることができます

all_teams = sorted(set(df['team1'])^set(df['team2'])) 
この入力を使用して実行

all_teams

['CSK', 'DC', 'DD', 'KKR', 'MI', 'RCB'] 

team1 team2 winner 
match   
1 MI  KKR  MI 
2 DD  CSK  DD 
3 RCB  DC  RCB 
4 RCB  CSK  RCB 

pd.concat((my_comp(df, team) for team in teams), keys=teams).groupby(level=[0, 1]).sum()

   wins losses 
    opponent   
CSK  DD  0  1 
     RCB  0  1 
DC  RCB  0  1 
DD  CSK  1  0 
KKR  MI  0  1 
MI  KKR  1  0 
RCB  CSK  1  0 
     DC  1  0 
関連する問題