根据顶部大熊猫填写

时间:2019-01-11 20:48:20

标签: python pandas dataframe

我有一个像这样的数据集:

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

以上内容无法正常工作。

4 个答案:

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