Как изменить данные в столбце, используя более длинную строку в PANDAS? - PullRequest
1 голос
/ 10 марта 2020

У меня есть датафрейм с двумя столбцами: имя и идентификатор. В некоторых случаях имена повторяются и также могут быть сокращены, но они всегда будут иметь один и тот же идентификатор, например:

     NAMES          ID
 1. Peter Elliot  12345678

 2. Peter Elliot  12345678

 3. Peter E.      12345678

 4. Lucas Kershaw 87654321

 5. Lucas Kershaw 87654321

 6. Lucas Kershaw 87654321

 7. L. Kershaw    87654321

... другие имена и идентификаторы ...

Таким образом, моя цель - отформатировать имена, используя более длинную строку, используя в качестве ссылки идентификатор.

Результат должен быть:

     NAMES          ID
 1. Peter Elliot  12345678

 2. Peter Elliot  12345678

 3. Peter Elliot  12345678

 4. Lucas Kershaw 87654321

 5. Lucas Kershaw 87654321

 6. Lucas Kershaw 87654321

 7. Lucas Kershaw 87654321

... другими именами и идентификаторами. ..

Я пробовал что-то вроде этого:

a = np.asarray(general['ids']

for j in range(len(a)):

    ToF = df['ids'] == a[j]   
    filts = df[ToF] 
    filtdf = filts.loc[filt, ['names']] 
    read_longer_string = filt400.names.astype(str).map(len)

    if read_longer_string.argmax() == read_longer_string.argmin():
        print('nothing should happen')

    elif read_longer_string.argmax() != read_longer_string.argmin():
        longer_string = filtfd.loc[read_longer_string.argmax(), 'names']   
        df['names'] = df['names'].where(filt == False, df['names'].apply(longer_string.format), errors = 'ignore')

1 Ответ

2 голосов
/ 10 марта 2020

Использование Series.str.len с groupby.transform:

df['NAMES'] = (df.loc[df['NAMES']
                 .str.len()
                 .groupby(df['ID'], sort=False)
                 .transform('idxmax'),'NAMES'].values)
print(df)
           NAMES        ID
1   Peter Elliot  12345678
2   Peter Elliot  12345678
3   Peter Elliot  12345678
4  Lucas Kershaw  87654321
5  Lucas Kershaw  87654321
6  Lucas Kershaw  87654321
7  Lucas Kershaw  87654321
...