Python 3.x 按一列分组并从另一列中查找重复项,然后在Python中返回指示

Python 3.x 按一列分组并从另一列中查找重复项,然后在Python中返回指示,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,给定一个小数据集df,如下所示,我需要groupbyfloor,在room中找到重复的数据集,然后返回Pandas中的check列: 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 我希

给定一个小数据集
df
,如下所示,我需要groupby
floor
,在
room
中找到重复的数据集,然后返回Pandas中的
check
列:

   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

如何修改条件代码?提前感谢您的帮助。

您可以将
np.where
复制的
一起使用。您可以查找
['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
您可以使用转换:

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

可能使用
None
代替
np.NaN