2017-10-20 3 views
0

私はパンダを使ってcsvファイルに簡単な投票スコアを実装しようとしています。基本的に `dataframe ['C'] ==アクティブでdataframe ['Count'] == 0の場合、dataframe ['Combo'] == 0. dataframe ['C'] ==アクティブとデータフレーム[ Count '] == 1; dataframe ['C'] ==アクティブでデータフレーム['Count'] == 2; dataframe ['Combo'] == 2などとなります。パンダで重複した値を無視する

これは私のデータフレームである:

A  B   C   Count Combo 
Ptn1 Lig1  Inactive 0  
Ptn1 Lig1  Inactive 1  
Ptn1 Lig1  Active  2  2 
Ptn2 Lig2  Active  0  0 
Ptn2 Lig2  Inactive 1  
Ptn3 Lig3  Active  0  0 
Ptn3 Lig3  Inactive 1  
Ptn3 Lig3  Inactive 2  
Ptn3 Lig3  Inactive 3  
Ptn3 Lig3  Active  4  3 

これは、明確にするために、これまでに私のコードです:

import pandas as pd 
df = pd.read_csv('affinity.csv') 
VOTE = 0 
df['Combo'] = '' 
df.loc[(df['Classification] == 'Active') & (df['Count'] == 0), 'Combo'] = VOTE 
df.loc[(df['Classification] == 'Active') & (df['Count'] == 1), 'Combo'] = VOTE + 1 
df.loc[(df['Classification] == 'Active') & (df['Count'] == 2), 'Combo'] = VOTE + 2 
df.loc[(df['Classification] == 'Active') & (df['Count'] > 3), 'Combo'] = VOTE + 3 

私のコードは、これを正しく行うことができました。ただし、Ptn3-Lig3のペアには2つの「アクティブ」値があります。2番目の値を無視する(つまり、最小のデータフレーム['Count']値のみを考慮する)方法はありますか?番号をデータフレームにする['Combo']? 私はpandas.DataFrame.drop_duplicates()が一意の値だけを選択する方法かもしれないが、実際にはどの行も削除しないでください。

答えて

1

あなたが行うことができますgroupby + apply

def foo(x): 
    m = x['C'].eq('Active') 
    if m.any(): 
     return pd.Series(np.where(m, x.loc[m, 'Count'].head(1), np.nan)) 
    else: 
     return pd.Series([np.nan] * len(x)) 

df['Combo'] = df.groupby(['A', 'B'], group_keys=False).apply(foo).values 
print(df) 

     A  B   C Count Combo 
0 Ptn1 Lig1 Inactive  0  
1 Ptn1 Lig1 Inactive  1  
2 Ptn1 Lig1 Active  2  2 
3 Ptn2 Lig2 Active  0  0 
4 Ptn2 Lig2 Inactive  1  
5 Ptn3 Lig3 Active  0  0 
6 Ptn3 Lig3 Inactive  1  
7 Ptn3 Lig3 Inactive  2  
8 Ptn3 Lig3 Inactive  3  
9 Ptn3 Lig3 Active  4  0 

groupby + mergeを持つ別の方法:これはあなたのグループを並べ替えて終わること

df = df.groupby(['A', 'B', 'C'])['C', 'Count']\ 
     .apply(lambda x: x['Count'].values[0] if x['C'].eq('Active').any() else np.nan)\ 
     .reset_index(name='Combo').fillna('').merge(df) 
print(df) 

     A  B   C Combo Count 
0 Ptn1 Lig1 Active  2  2 
1 Ptn1 Lig1 Inactive   0 
2 Ptn1 Lig1 Inactive   1 
3 Ptn2 Lig2 Active  0  0 
4 Ptn2 Lig2 Inactive   1 
5 Ptn3 Lig3 Active  0  0 
6 Ptn3 Lig3 Active  0  4 
7 Ptn3 Lig3 Inactive   1 
8 Ptn3 Lig3 Inactive   2 
9 Ptn3 Lig3 Inactive   3 

注意。

+0

ありがとうございます。このサンプルデータフレームでは機能しましたが、実際に適用しようとするとエラーが発生しました:return pd.Series(n ,. '')) ValueError:オペランドを図形(5、)(0、)()とともにブロードキャストできませんでした。あなたはその機能が何をしているのか説明できますか?私はパイソンとパンダには本当に新しいです。 –

+1

@MarcosSantana編集を参照してください?私はこの問題を理解したかもしれないと思う。 –

+0

ああちょうどそれを見た。これで機能が実行されます。しかし、私はまだPtn3-Lig3ペアについて2つの値を得ています。その関数でなければ、その2番目の値をNaNなどに変更する方法がありますか?その機能をもう一度ありがとう! –

関連する問題