Заполните на основе верхней колонны панд - PullRequest
0 голосов
/ 11 января 2019

У меня есть такой набор данных:

ID   Value
1     A
2     B
3     X
3     Y
3     Y
3     D
4     C
5     C

Для каждого экземпляра повторяющегося идентификатора, где верхнее значение X, а соответствующие значения Y, я хочу заполнить X. Результирующий набор выглядит так:

ID   Value
1     A
2     B
3     X
3     X
3     X
3     D
4     C
5     C

Я пытался замаскировать и заполнить так:

df['Value']= df.Value.mask(~df.Value.isin(['X', 'Y'])).ffill()

Выше не работает, как задумано.

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Другое решение с использованием 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
0 голосов
/ 12 января 2019

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
0 голосов
/ 12 января 2019

Это не самое красивое решение, но, по крайней мере, оно выполняет свою работу: df.loc[(df.id.isin(df[df.val=="X"].id.unique())) & (df.val=="Y"), "val"] = "X"

0 голосов
/ 12 января 2019

Делай с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...