2017-01-04 13 views
1

は、すべての顧客に複製し、NA値にスコアをコピー見つける方法割り当て値

Customer Score 
3a62-4799 500 
3a62-4799 NA 
3a62-1234 450 
3a62-1234 NA 

でデータフレームを存在しています。私はこのアプローチを試みた

X['Score'][((X.set_index('Customer').index.get_duplicates()) & (X['Score']>0)).any()] =X['Score'] 

しかし、それは各グループにのみ最初の何NaN値でない場合、私はあなたがduplicatedffillを使用することができると思う

ValueError: Arrays were different lengths:

答えて

5

動作しません:

print (df) 
    Customer Score 
0 3a62-4000 NaN 
1 3a62-4799 500.0 
2 3a62-4799 NaN 
3 3a62-1234 450.0 
4 3a62-1234 NaN 

df.loc[df.Customer.duplicated(keep=False), 'Score'] = df.Score.ffill() 
print (df) 
    Customer Score 
0 3a62-4000 NaN 
1 3a62-4799 500.0 
2 3a62-4799 500.0 
3 3a62-1234 450.0 
4 3a62-1234 450.0 

グループごとに複数の値を入力すると、重複を記入することができます。またはapplyと(summedian ...):別の方法として

print (df) 
    Customer Score 
0 3a62-4000 NaN 
1 3a62-4799 500.0 
2 3a62-4799 200.0 
3 3a62-4799 NaN 
4 3a62-1234 450.0 
5 3a62-1234 NaN 

df['Score'] = df.groupby('Customer')['Score'].transform(lambda x: x.fillna(x.mean())) 
#df['Score'] = df.groupby('Customer')['Score'].apply(lambda x: x.fillna(x.mean())) 
print (df) 
    Customer Score 
0 3a62-4000 NaN 
1 3a62-4799 500.0 
2 3a62-4799 200.0 
3 3a62-4799 350.0 
4 3a62-1234 450.0 
5 3a62-1234 450.0 
+0

とても良い解決策です。ありがとう! – Oxymoron88

+0

@ Oxymoron88 - ありがとうございます。 – jezrael

+0

ニースの解決策。プラスワン – akrun

0

、あなたは、各顧客IDに埋める転送するためにgroupbyを使用する場合があります。 @ jezrealの答えからのデータセットを使用して

df.Score = df.groupby('Customer').ffill() 

、出力は

df 
Out[10]: 
    Customer Score 
0 3a62-4000 NaN 
1 3a62-4799 500 
2 3a62-4799 500 
3 3a62-1234 450 
4 3a62-1234 450 
0

残念ながら値がNaNの最初の重複行で、時には実際の値が第一である時々混合されるだろう。

私のアプローチは100000行で30分間働いています。それはもう少しです

X_dup = X.set_index('Customer').index.get_duplicates() 

for l in list(X_dup): 

    up_cust = pd.DataFrame(X[(X['Customer']==l) & (X['Score'] > 0)]) 

    X['Score'][X['Customer']==l ] = up_cust.iloc[0,1]