2017-11-07 25 views
1

初めてのポスターはここにあります。私はこれについての助けを求める過去2日間を探していますが、まだそれを把握する必要があります。データフレーム列に関数を適用して反復列を作成する方法

私はシステムイベント時間のIDを持っていますが、id(個々のシステム)でイベント時刻をグループ化し、eventtimes.diff()が1日より大きい場合は値が1である新しい列を作成しました。 。今私は、新しい列が1で始まるようにgroupby( 'ID')に適用される関数を作成しようとしているフラグを持っていると、フラグが1を示して新しい列は1から2に上がり、フラグが再び1になるまで2を返し続けます。

私はgroupby( 'ID')と一緒にこれを適用します。これは、各IDごとに1つずつ新しい列を開始する必要があるためです。

私を次のように試してみました:

def try(x): 
    y = 1 
    if row['flag']==0: 
     y = y 
    else: 
     y += y+1 

df['NewCol'] = df.groupby('ID')['flag'].apply(try) 

私は無駄に上記の異なるバリエーションを試してみました。あなたが提供するかもしれない助けを前もって感謝します。

また、私が質問を投稿することを台無しにした場合は、私に知らせてください。私のタイトルも素晴らしいかどうかは分かりません。愚かapplyとしてはるかに高速なソリューションです何フィルタリング+ + reindexcumcountため

+0

100%わからない、いくつかの10行のデータを追加しますので、もしより良い説明のために2つのグループと一緒に役立つでしょう。 – jezrael

答えて

0

使用boolean indexing

私はあなただけ1グループごとに、次に何11が出力に追加されていない場合は、カウントのために必要だと思う:

df = pd.DataFrame({ 
    'ID': ['a','a','a','a','b','b','b','b','b'], 
    'flag': [0,0,1,1,0,0,1,1,1] 
}) 


df['new'] = (df[df['flag'] == 1].groupby('ID')['flag'] 
           .cumcount() 
           .add(1) 
           .reindex(df.index, fill_value=1)) 
print (df) 
    ID flag new 
0 a  0 1 
1 a  0 1 
2 a  1 1 
3 a  1 2 
4 b  0 1 
5 b  0 1 
6 b  1 1 
7 b  1 2 
8 b  1 3 

詳細:

#filter by condition 
print (df[df['flag'] == 1]) 
    ID flag 
2 a  1 
3 a  1 
6 b  1 
7 b  1 
8 b  1 

#count per group 
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount()) 
2 0 
3 1 
6 0 
7 1 
8 2 
dtype: int64 

#add 1 for count from 1 
print (df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1)) 
2 1 
3 2 
6 1 
7 2 
8 3 
dtype: int64 

必要がある場合は、0をカウントし、何0-1追加されていない場合:

df['new'] = (df[df['flag'] == 0].groupby('ID')['flag'] 
           .cumcount() 
           .add(1) 
           .reindex(df.index, fill_value=-1)) 
print (df) 
    ID flag new 
0 a  0 1 
1 a  0 2 
2 a  1 -1 
3 a  1 -1 
4 b  0 1 
5 b  0 2 
6 b  1 -1 
7 b  1 -1 
8 b  1 -1 

別の2段階のソリューション:あなたの問題を理解していれば

df['new'] = df[df['flag'] == 1].groupby('ID')['flag'].cumcount().add(1) 
df['new'] = df['new'].fillna(1).astype(int) 
print (df) 
    ID flag new 
0 a  0 1 
1 a  0 1 
2 a  1 1 
3 a  1 2 
4 b  0 1 
5 b  0 1 
6 b  1 1 
7 b  1 2 
8 b  1 3 
関連する問題