我有一个像这样的数据集:
last_index = len(messages) - 1
msg = service.users().messages().get(userId='me', id=messages[last_index]['id']).execute()
print(msg['snippet'])
对于重复ID的每个实例,其最高值是X而相应的值是Y,我想用X填充。 结果集如下:
ID Value
1 A
2 B
3 X
3 Y
3 Y
3 D
4 C
5 C
我试图像这样掩盖并填充:
ID Value
1 A
2 B
3 X
3 X
3 X
3 D
4 C
5 C
以上内容无法正常工作。
答案 0 :(得分:2)
使用mask
+ np.where
s1=df.Value.mask(df.Value=='Y').groupby(df['ID']).ffill()
df.Value=np.where((s1!=df.Value)&(s1=='X'),s1,df.Value)
答案 1 :(得分:0)
IIUC:
edict = df.groupby('ID').Value.first().to_dict())
temp = df[(df.ID.isin(idx)) & (df.Value == 'Y')].ID.values
df.loc[(df.ID.isin(idx)) & (df.Value == 'Y'), 'Value'] = [edict[x] for x in temp]
输出:
ID Value
0 1 A
1 2 B
2 3 X
3 3 X
4 3 X
5 3 D
6 4 C
7 5 C
答案 2 :(得分:0)
这不是最漂亮的解决方案,但至少可以完成工作:
df.loc[(df.id.isin(df[df.val=="X"].id.unique())) & (df.val=="Y"), "val"] = "X"
答案 3 :(得分:0)
使用np.where()
和pd.series.duplicated()
的另一种解决方案:
df['ID_duplicated']=df.ID.duplicated()
cond = (df.ID_duplicated==True ) & (df.Value=='Y')
df.Value = np.where(cond,'X',df.Value)
>>df
ID Value ID_duplicated
0 1 A False
1 2 B False
2 3 X False
3 3 X True
4 3 X True
5 3 D True
6 4 C False
7 5 C False