2017-06-28 4 views
0

以下は私のテーブル(Pythonデータフレーム)です。最後の列を紫色のテキストで作成しようとしています。以下は複合条件付き加算ロジックを使用してデータフレームに新しいフィールドを作成

enter image description here

私が実装するロジックです:関連する「ジップ」フィールドの値は、次に設定されているすべて同じである場合は、それぞれ独自の「CBSA」の値については

  1. 「age_HC01_EST_VC31_2」 'age_HC01_EST_VC31'フィールドに等しいフィールド(黄色で強調表示された行を参照)。

  2. それぞれの 'zip'フィールド値が異なる場合、 'age_HC01_EST_VC31_2'フィールドの値は 'age_HC01_EST_VC31'フィールド値の合計と同じです(オレンジ色で強調表示された行を参照)。各ユニーク「CBSA」値について

  3. 、関連する「ZIP」フィールドの値は、いくつか同じである場合、いくつかの異なった、次いで(強調表示された行を参照UNIQUE「age_HC01_EST_VC31」フィールド値の合計に等しい「age_HC01_EST_VC31_2」フィールドを設定します青色の)。

私はGROUPBYを使用してみましたし、その後「CBSA」フィールドに合計...しかし、それは私が実装しようとしている具体的な、多層のロジックでは動作しませんしています。

答えて

0

私が間違っていない場合、ロジックは次のように要約できます:ユニークな 'cbsa'値ごとに、 'age_HC01_EST_VC31_2'フィールドをUNIQUE 'age_HC01_EST_VC31'フィールド値の合計と等しく設定します。

これが正しい場合は、最初にグループcbsaでグループ化し、一意のage_HC01_EST_VC31値を見つけて合計します。

import pandas as pd 
dic = {'zip': [57401, 57401, 57401, 57401, 98520, 98550, 79604, 79602, 79602, 79601], 
     'age_HC01_EST_VC31': [15.5, 15.5, 15.5, 15.5, 13.5, 17.3, 14.9, 18, 18, 11], 
     'cbsa': [10100, 10100, 10100, 10100, 10140, 10140, 10180, 10180, 10180, 10180]} 
df = pd.DataFrame(dic) 
df.join(df.groupby('cbsa').age_HC01_EST_VC31.unique().apply(sum), on='cbsa', rsuffix='_2') 

# age_HC01_EST_VC31 cbsa zip age_HC01_EST_VC31_2 
# 0    15.5 10100 57401     15.5 
# 1    15.5 10100 57401     15.5 
# 2    15.5 10100 57401     15.5 
# 3    15.5 10100 57401     15.5 
# 4    13.5 10140 98520     30.8 
# 5    17.3 10140 98550     30.8 
# 6    14.9 10180 79604     43.9 
# 7    18.0 10180 79602     43.9 
# 8    18.0 10180 79602     43.9 
# 9    11.0 10180 79601     43.9 
1
df['new_column']="" #Initialise and empty column 

#iterate through all unique values 
for item in df['cbsa'].unique(): 
    if len(df['zip'].loc[df['cbsa']==item].unique())==1: 
     df['new_column'].loc[df['cbsa']==item] = df['age_HC01_EST_VC31'].loc[df['cbsa']==item] 
    else: 
     df['new_column'].loc[df['cbsa']==item] = sum(df['age_HC01_EST_VC31'].loc[df['cbsa']==item].unique()) 
+0

他にも簡単な方法があるかもしれません。しかし、これも動作します – user3687197

0

(あなたは年齢の列の名前を変更する必要がある - 私はちょうどAGE1それを呼ばれる)これは長い道のりですが、仕事が行われます。

grouped = df.groupby(['cbsa','zip'])[['age1']].mean().reset_index() 
summed = grouped.groupby(['cbsa'])[['age1']].sum().reset_index() 
df = pd.merge(df, summed, how='left', on='cbsa') 
関連する問題