Python 为数据帧中的重复行赋值

Python 为数据帧中的重复行赋值,python,pandas,Python,Pandas,存在带有 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:数组的长度不同: 我

存在带有

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:数组的长度不同:

我认为您可以使用if在每个组中仅为first no NaN值:

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
…):


或者,您可以使用
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

不幸的是,有时值是混合的,有时是重复行中的第一个值,有时是第一个实际值

我处理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]

非常好的解决方案。谢谢很好的解决方案。加上one@dih78-如果我的回答有用,别忘了。谢谢
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]