我有一个熊猫数据框df
:
s = {'id': [243,243, 243, 243,443,443,443],
'st': [1,3,5,9,2,6,7],
'value':[2.4, 3.8, 3.7, 5.6, 1.2, 0.2, 2.1]}
df = pd.DataFrame(s)
如下所示:
id st value
0 243 1 2.4
1 243 3 3.8
2 243 5 3.7
3 243 9 5.6
4 443 2 1.2
5 443 6 0.2
6 443 7 2.1
除了每个value
的第一条记录外,我想为所有记录将0设为id
。我的预期输出是:
id st value
0 243 1 2.4
1 243 3 0
2 243 5 0
3 243 9 0
4 443 2 1.2
5 443 6 0
6 443 7 0
如何使用熊猫数据框来做到这一点?
答案 0 :(得分:2)
这是检查id
中重复项并将boolean
结果乘以value
的一种方法:
df['value'] = (~df.id.duplicated('first')).mul(df.value)
id st value
0 243 1 2.4
1 243 3 0.0
2 243 5 0.0
3 243 9 0.0
4 443 2 1.2
5 443 6 0.0
6 443 7 0.0
答案 1 :(得分:2)
另一种方法是:
df.loc[df.id.eq(df.id.shift()),'value']=0
print(df)
id st value
0 243 1 2.4
1 243 3 0.0
2 243 5 0.0
3 243 9 0.0
4 443 2 1.2
5 443 6 0.0
6 443 7 0.0
答案 2 :(得分:1)
使用Series.duplicated
或DataFrame.loc
通过掩码使用numpy.where
设置值:
df.loc[df['id'].duplicated(), 'value'] = 0
或者:
df['value'] = np.where(df['id'].duplicated(), 0, df['value'])
print (df)
id st value
0 243 1 2.4
1 243 3 0.0
2 243 5 0.0
3 243 9 0.0
4 443 2 1.2
5 443 6 0.0
6 443 7 0.0
答案 3 :(得分:0)
尝试一下:
tf=df['id'].duplicated() # True and False
df.loc[tf,"value"]=0 # replace values in value with 0 for trues only
print(df)