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]