#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