将值分配给pandas dataframe

时间:2017-01-04 14:26:00

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

3 个答案:

答案 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

如果每个群组有多个值,您可以meansummedian ...)使用transformapply填写重复项:

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]