使用
存在数据框Customer Score
3a62-4799 500
3a62-4799 NA
3a62-1234 450
3a62-1234 NA
如何找到客户的所有副本并将分数复制到NA值。
我试过这种方法
X['Score'][((X.set_index('Customer').index.get_duplicates()) & (X['Score']>0)).any()] =X['Score']
但它不起作用
ValueError:数组的长度不同:
答案 0 :(得分:5)
我认为如果每个组中只有第一个没有NaN值,则可以ffill
使用duplicated
:
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
如果每个群组有多个值,您可以mean
(sum
,median
...)使用transform
或apply
填写重复项:
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
答案 1 :(得分:0)
作为替代方案,您可以使用groupby
转发每个客户ID的填充。
df.Score = df.groupby('Customer').ffill()
使用@ jezreal的答案中的数据集,输出将是
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
答案 2 :(得分: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]