Группировать по одному столбцу и находить дубликаты из другого столбца, затем возвращать указания в Python

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

Учитывая небольшой набор df данных следующим образом, мне нужен groupby floor , найдите дубликаты room , а затем верните check столбец в Pandas:

    id  floor   room
0   1      1  101.0
1   2      1  102.0
2   3      2  201.0
3   4      2  201.0
4   5      2  202.0
5   6      3    NaN
6   7      3  201.0
7   8      3  301.0
  

Я хотел бы использовать код следующим образом, поскольку есть много других столбцов для проверки:

 a = np.where(condition, None, 'duplicates')
# b = np.where(df.area.str.contains('^d $', na = True), None,
#                                  'area is not a numbers')  
f = (lambda x: ';'.join(y for y in x if pd.notna(y)) 
                if any(pd.notna(np.array(x))) else np.nan )
df['check'] = [f(x) for x in zip(a)]
  

Ожидаемый результат будет таким:

    id  floor   room       check
0   1      1  101.0         NaN
1   2      1  102.0         NaN
2   3      2  201.0  duplicates
3   4      2  201.0  duplicates
4   5      2  202.0         NaN
5   6      3    NaN         NaN
6   7      3  201.0         NaN
7   8      3  301.0         NaN
  

Как я мог изменить код условия? Заранее спасибо за вашу помощь.

Ответ №1:

вы можете использовать np.where with duplicated . Вместо группировки по этажам вы можете искать дубликаты подмножества ['floor', 'room'] и передавать keep=False , чтобы отметить оба дубликата:

 df['check'] = np.where(df.duplicated(['floor', 'room'], keep = False), 'duplicates', np.NaN)
df
Out[1]: 
   id  floor   room       check
0   1      1  101.0         nan
1   2      1  102.0         nan
2   3      2  201.0  duplicates
3   4      2  201.0  duplicates
4   5      2  202.0         nan
5   6      3    NaN         nan
6   7      3  201.0         nan
7   8      3  301.0         nan
  

Комментарии:

1. Может быть, использовать None вместо np.NaN ?

Ответ №2:

вы можете использовать преобразование:

 df["count"] = df.groupby(["floor", "room"]).transform("count")
  

Результат:

    id  floor   room      count
0   1      1  101.0        1.0
1   2      1  102.0        1.0
2   3      2  201.0        2.0
3   4      2  201.0        2.0
4   5      2  202.0        1.0
5   6      3    NaN        NaN
6   7      3  201.0        1.0
7   8      3  301.0        1.0