Как я могу удалить элемент в списке, используя сравнение между списком и индексом в пандах? - PullRequest
0 голосов
/ 20 декабря 2018

Это мой фрейм данных:

Cites_Dogs  Dog_Number
DOG45555    DOG123
DOG127      DOG123
DOG7760     DOG126
DOG45       DOG126
DOG559      DOG126
DOG760      DOG126
DOG123      DOG127
DOG789      DOG127
DOG860      DOG127

Я преобразовал в список по этому коду:

all_cites_dog = all_cites_dog.groupby('Dog_Number')['Cites_Dogs'].apply(list)

Я хотел бы удалить элемент в списке, который не соответствуетс индексом DOG123 , DOG126 , DOG127 .

DOG123   [ 'DOG45555' ,  'DOG127']
DOG126   [ 'DOG7760', 'DOG456' ,  'DOG559' ,  'DOG760']
DOG127   [ 'DOG123' ,  'DOG789' ,  'DOG860']

Я хотел бы видеть результаты, подобные этому:

DOG123   [ 'DOG127']
DOG126   ['']
DOG127   [ 'DOG123']

Что мне делать ТТ?

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Попробуйте, если это работает только одно линейное решение:

df = pd.DataFrame({'Cites_Dogs':  ['DOG45555' ,'DOG127' , 'DOG7760' ,'DOG45','DOG559','DOG760','DOG123','DOG789','DOG860'],
               'Dog_Number': ['DOG123', 'DOG123', 'DOG126', 'DOG126', 'DOG126', 'DOG126', 'DOG127', 'DOG127', 'DOG127']})
a = ['DOG123', 'DOG126', 'DOG127']

df['Cites_Dogs'][~df['Cites_Dogs'].isin(a)] = np.nan

df.replace([np.nan], '', inplace=True)

df = df.groupby('Dog_Number')['Cites_Dogs'].apply(list)

# and output looks like this
Dog_Number
DOG123      [, DOG127]
DOG126        [, , , ]
DOG127    [DOG123, , ]
Name: Cites_Dogs, dtype: object

Спасибо!

0 голосов
/ 20 декабря 2018

Вы можете выполнить широкие шаги:

  1. Отфильтровать ваш фрейм данных в соответствии с Cites_Dogs.
  2. Выполните groupby + apply с list.
  3. Переиндексируйте ваш фрейм данных в соответствии с уникальными номерами собак.
  4. Замените NaN значения пустыми списками для согласованности.

Вот демонстрация:

unq_dogs = df['Dog_Number'].unique()

res = df.loc[df['Cites_Dogs'].isin(unq_dogs]\
        .groupby('Dog_Number')['Cites_Dogs'].apply(list)\
        .reindex(unq_dogs)\
        .fillna(pd.Series([[] for _ in range(len(unq_dogs))], index=unq_dogs))\
        .reset_index()

print(res)

  Dog_Number Cites_Dogs
0     DOG123   [DOG127]
1     DOG126         []
2     DOG127   [DOG123]
0 голосов
/ 20 декабря 2018

Вы можете использовать apply и использовать понимание списка, чтобы сохранить элементы в индексе:

l = all_cites_dog.index
all_cites_dog.apply(lambda x: [i for i in x if i in l])

Dog_Number
DOG123    [DOG127]
DOG126          []
DOG127    [DOG123]
Name: Cites_Dogs, dtype: object
0 голосов
/ 20 декабря 2018

Вы можете выполнить фильтрацию по чеку isin.

(df.set_index('Dog_Number')
   .query("Cites_Dogs in index")
   .reindex(df.Dog_Number.unique()))

           Cites_Dogs
Dog_Number           
DOG123         DOG127
DOG126            NaN
DOG127         DOG123

Если необходимо дальнейшее сокращение, вы можете выполнить цепочку groupby.

(df.set_index('Dog_Number')
   .query("Cites_Dogs in index")
   .reindex(df.Dog_Number.unique())
   .groupby(level=0)['Cites_Dogs']
   .apply(pd.Series.tolist))

Dog_Number
DOG123    [DOG127]
DOG126       [nan]
DOG127    [DOG123]
Name: Cites_Dogs, dtype: object

Другой вариант -groupby и apply с установленной проверкой членства.

s = set(df.Dog_Number)
df.groupby('Dog_Number').Cites_Dogs.apply(lambda x: x[x.isin(s)].tolist())

Dog_Number
DOG123    [DOG127]
DOG126          []
DOG127    [DOG123]
Name: Cites_Dogs, dtype: object
0 голосов
/ 20 декабря 2018

Использовать фильтрацию в groupby+apply:

idx = set(all_cites_dog['Dog_Number'])
all_cites_dog = (all_cites_dog.groupby('Dog_Number')['Cites_Dogs']
                             .apply(lambda x: list([y for y in x if y in idx])))

print (all_cites_dog)
Dog_Number
DOG123    [DOG127]
DOG126          []
DOG127    [DOG123]
Name: Cites_Dogs, dtype: object

Для повышения производительности сначала выполните фильтрацию по boolean indexing и isin, а затем groupby,последнее добавление отсутствует несоответствующие пустые значения:

s = (all_cites_dog[all_cites_dog['Cites_Dogs'].isin(all_cites_dog['Dog_Number'].unique())]
             .groupby('Dog_Number')['Cites_Dogs']
             .apply(list))

idx = np.setdiff1d(all_cites_dog['Dog_Number'].unique(), s.index)
s1 = pd.Series([[]] * len(idx), index=idx)
print (s1)
DOG126    []
dtype: object

s = s.append(s1).sort_index()
print (s)
DOG123    [DOG127]
DOG126          []
DOG127    [DOG123]
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...