2016-05-10 9 views
1

データフレームがあり、2列の値に基づいて新しい列を追加したい場合は、グループmaxを使用します。例えば、ここでの例では、今DataFrameグループの最大値に基づいてDataFrame列に新しい値を割り当てます。

import pandas as pd 
import numpy as np 


df = pd.DataFrame({"col1": ['a'] * 2 + ['b'] * 4, 
        "col2": [1, 2, 1, 2, 3, 4], 
        "col3": ['yep', 'no', 'no', 'no', 'yep', 'yep']}) 


df 
    col1 col2 col3 
0 a  1 yep 
1 a  2 no 
2 b  1 no 
3 b  2 no 
4 b  3 yep 
5 b  4 yep 

だ、何を私がしたいことはcol2がグループ最大で「はい」と言った新しい列は、col1col3にグループ分けして、「うん」と同じです。

col1 col2 col3 col4 
0 a  1 yep no 
1 a  2 no no 
2 b  1 no no 
3 b  2 no no 
4 b  3 yep no 
5 b  4 yep yes 

私は以下のコードを試してみたが、私は、戻り値に若干の誤差を取得しています:

# define function 
def max_bal(df): 
    max_row = df['col2'].max() 
    label = np.where((df['col3'] == 'yep') & 
        (df['col2'] == max_row), 
        'Yes', 
        'No') 
    return label 

今文で

df.groupby('col1').apply(max_bal) 

col1 
a    [No, No] 
b [No, No, No, Yes] 
dtype: object 

を、グループ内の関数を呼び出しますこれらは正しい値ですが、私が期待する通りSeriesで返されません。 Series/array/list上記のdfの新しい列にこれらの値を割り当てようとしているので、私は1つを必要とします( `col4 'を参照)。どんな指針も大変ありがとうございます。

答えて

3

labelsは、機能が適用されているグループと同じインデックスを持つDataFrameとして返すことができます。

def max_bal(df): 
    max_row = df['col2'].max() 
    labels = np.where((df['col3'] == 'yep') & 
        (df['col2'] == max_row), 
        'Yes', 
        'No') 
    return pd.DataFrame(labels, index=df.index) 

df['col4'] = df.groupby('col1').apply(max_bal) 
+0

これは機能しますが、なぜですか?私はPython/pandasを学んでいます。私は最初の試みとDataFrameソリューションとのギャップを、オリジナルのDataFrameインデックスを指定して橋渡ししようとしています。 –

関連する問題