2017-08-10 4 views
1

に結果を放送し、私は、フォームのパンダのデータフレームを持っている:パンダマルチカラム上GROUPBYと、元のデータフレーム

 bowler inning wickets Total_wickets matches balls 
0 SL Malinga  1  69   143   44 4078 
1 SL Malinga  2  74   143   54 4735 
2 A Mishra  1  48   124   50 3908 
3 A Mishra  2  76   124   62 4930 
4 DJ Bravo  1  61   122   48 3887 

私は「山高」と「イニング」に、このDFをGROUPBYし、実行したいと思います'wickets'と 'balls'列の計算を行い、新しい列と同じdfにブロードキャストします。 私が試みた方法の一つは、のような変換を使用することでした:これはKeyError例外例外になり

df_bowler['strike rate'] = df_bowler.groupby(['bowler','inning']).transform(lambda x : x['balls']/x['wickets']) 

KeyError: ('balls', 'occurred at index wickets')

私は私のようなマージが続く適用使って、必要なものを達成:

df_strRate = df_bowler.groupby(['bowler','inning']).apply(lambda x:x['balls']/x['wickets']).reset_index(level=2,drop=True).reset_index(name='strike rate') 
df_bowler = df_bowler.merge(df_strRate,on=['bowler','inning']) 

しかし、これはやっかいなようです。この場合、変換が失敗する理由を知りたい。すべてのポインタ?

ありがとうございました。

答えて

2

変換が間違った軸に沿って適用されていて、最初にsum()などの集計を使用する必要があるため、変換が失敗しています。

In [83]: df.groupby(['bowler', 'inning']).sum().transform(lambda x : x['balls'].astype(float)/x['wickets'].astype(float), axis=1) 
Out[83]: 
bowler  inning 
A Mishra 1   81.416667 
      2   64.868421 
DJ Bravo 1   63.721311 
SL Malinga 1   59.101449 
      2   63.986486 
dtype: float64 

しかし、あなたは同様に行うことができます:これをチェックしてください

In [88]: df['strike_rate'] = df.balls/df.wickets 
In [89]: df 
Out[89]: 
     bowler inning wickets Total_wickets matches balls strike_rate 
0 SL Malinga  1  69   143  44 4078 59.101449 
1 SL Malinga  2  74   143  54 4735 63.986486 
2 A Mishra  1  48   124  50 3908 81.416667 
3 A Mishra  2  76   124  62 4930 64.868421 
4 DJ Bravo  1  61   122  48 3887 63.721311 
+0

私はあなたが間違っていると思うあなたの変換[ 'GroupBy.transform'](HTTPではありません。 podata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.transform.html)、['DataFrame.transform'](http://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.transform.html)、 'sum'を集計してから別のデータフレームを出力するためです。 – jezrael

+0

なぜ私の最初の変換に失敗したのか、ありがとう。しかし、あなたの変換ソリューションを動作させることができませんでした。変換時にattributeErrorが返されます。 – Tontodoin

+0

私はそれについてのトレースバックを見なければならないでしょう。私はもう一度やり直しました。私は特別なことをする必要はなく、それはまだ機能しました。 'dfを確認してください。keys() ' –

0

編集:場合

は、()

df = df.merge(df.groupby(['bowler', 'inning']).apply(lambda x : sum(x['balls']/x['wickets')]).reset_index(), on=['bowler', 'inning']).rename(columns={0:'Mycolumn'}) 
#If you don't want a rename then new resulted column will be named as 0. As per your wish, use it/discard rename part. 

を適用し使用して、以下の方法を試してみてくださいまたは、単純な列操作が必要な場合は、私はCoryの2番目のオプションを好む。

1

[]の列最初個別Seriesで作業定義されていない場合、問題GroupBy.transform機能がある - そう一緒に2列で作業することができない、不可能分割それら:[]の列を定義する場合

def f(x): 
    print (x) 

2 48 
Name: wickets, dtype: int64 
2 124 
Name: Total_wickets, dtype: int64 
2 50 
Name: matches, dtype: int64 
2 3908 
Name: balls, dtype: int64 

df = df_bowler.groupby(['bowler','inning']).transform(f) 

を:

def f(x): 
    print (x) 

2 3908 
Name: (A Mishra, 1), dtype: int64 
3 4930 
Name: (A Mishra, 2), dtype: int64 
4 3887 
Name: (DJ Bravo, 1), dtype: int64 
0 4078 
Name: (SL Malinga, 1), dtype: int64 
1 4735 
Name: (SL Malinga, 2), dtype: int64 


df = df_bowler.groupby(['bowler','inning'])['balls'].transform(f) 

同じように動作するDataFrameGroupBy.agg機能。グループでデータを扱うにはGroupBy.applyが必要な場合

:結論

- ://パンダ

def f(x): 
    print (x) 

    bowler inning wickets Total_wickets matches balls 
2 A Mishra  1  48   124  50 3908 
    bowler inning wickets Total_wickets matches balls 
2 A Mishra  1  48   124  50 3908 
    bowler inning wickets Total_wickets matches balls 
3 A Mishra  2  76   124  62 4930 
    bowler inning wickets Total_wickets matches balls 


df = df_bowler.groupby(['bowler','inning']).apply(f) 
+0

この要約は非常に便利です。ありがとう! – Tontodoin

関連する問題