Как получить индексы строк, у которых значения х числа объектов одинаковы, но отличаются одним признаком? - PullRequest
1 голос
/ 23 марта 2019

Пример кадра данных:

pd.DataFrame({'Name':['John','Peter','John','John','Donald'],
              'City':['Boston','Japan','Boston','Dallas','Japan'],
              'Age':[23,31,21,21,22]})

dataframe

Я хочу получить список индексов всех строк, имеющих одинаковые «Имя» и «Город», но разного возраста, используя панд.
В этом случае: он должен вернуть [0,2]

Ответы [ 3 ]

3 голосов
/ 23 марта 2019

Попробуйте это ниже:

df[df.duplicated(['Name','City'],keep=False)&~df.duplicated(keep=False)]

   Name    City  Age
0  John  Boston   23
2  John  Boston   21

РЕДАКТИРОВАТЬ: сценарий, на который указал @ALollz, может быть реализован с помощью:

df = pd.DataFrame({'Name':['John','Peter','John','John','Donald', 'John'],
              'City':['Boston','Japan','Boston','Dallas','Japan', 'Boston'],
              'Age':[23,31,21,21,22, 23]})
df[df.duplicated(['Name','City'],keep=False)].drop_duplicates()

Выход:

   Name    City  Age
0  John  Boston   23
2  John  Boston   21
1 голос
/ 23 марта 2019

Я хочу получить список индексов всех строк, которые имеют одинаковые «Имя» и «Город», но разный возраст

Я думаю, что это немного неоднозначно, потому чтоесли в группе «Город имени» есть комбинация записей одного возраста и нескольких разных?В зависимости от желаемого выхода groupby + transform + nunique для фильтрации может потребоваться.

Пример данных:

Обратите внимание, здесь добавлен регистр ребер, где John Boston 23дублируется:

import pandas as pd
df = pd.DataFrame({'Name':['John','Peter','John','John','Donald', 'John'],
                  'City':['Boston','Japan','Boston','Dallas','Japan', 'Boston'],
                  'Age':[23,31,21,21,22, 23]})

#     Name    City  Age
#0    John  Boston   23
#1   Peter   Japan   31
#2    John  Boston   21
#3    John  Dallas   21
#4  Donald   Japan   22
#5    John  Boston   23

Код:

df[df.groupby(['Name', 'City']).Age.transform(pd.Series.nunique).gt(1)]

#   Name    City  Age
#0  John  Boston   23
#2  John  Boston   21
#5  John  Boston   23

При других решениях точное дублирование может привести к нежелательному выводу:

df[df.duplicated(['Name','City'],keep=False)&~df.duplicated(keep=False)]
#   Name    City  Age
#2  John  Boston   21
0 голосов
/ 23 марта 2019

Другой метод может быть с помощью groupby ():

df[df.groupby(['Name', 'City']).transform(len)['Age']>1]

или может быть в два шага, как при использовании duplicated ():

df =df.set_index('Age')
df[df.duplicated(['Name', 'City'], keep = False)].reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...