首页 > 解决方案 > 根据多列条件选择熊猫数据框中的行

问题描述

我有一个数据集如下

id     date  time  domain       activity
1  20thdec     2  amazon  add to basket
1  21stdec     2  amazon   product view
1  21stdec     3  amazon  add to basket
1  21stdec     4  amazon  add to basket
2  21stdec     4  amazon  add to basket
2  21stdec     6  amazon  add to basket 

如何摆脱在活动列中包含相同值的行(即device_id = 2唯一的活动是add to basket。我仍然想保留id 1具有多个(重复)值add to basket但它也有其他活动的格式

我试过pd.drop_duplicates了,但这并不能解决问题。

编辑:以下解决方案均无效,我需要如下输出

id     date  time  domain       activity
1  20thdec     2  amazon  add to basket
1  21stdec     2  amazon   product view
1  21stdec     3  amazon  add to basket
1  21stdec     4  amazon  add to basket

id = 2 的数据应该被删除,就像所有活动一样,无论日期/时间如何,都只包含添加到购物篮中,因此所有单个活动行都应该被删除,并且只保留列出了多个活动的数据行,即 id = 1 有 2 个活动级别(产品视图和添加到购物篮)

如果造成任何误解,敬请见谅

谢谢

标签: pythonpandas

解决方案


IIUC,使用groupby+transformnunique计算cumsum不等于 ( ne)的值1,然后使用drop_duplicateswithsubset参数:

df.dropna(how='all',inplace=True)
cols = df.columns
df['Unique'] = df.groupby('id')['activity'].transform('nunique')
mask = df['Unique'].ne(1)
df.loc[mask,'Unique'] = df.loc[mask,'Unique'].cumsum()

df1 = df.drop_duplicates(subset = ['activity','Unique'])[cols]

print(df1)

   id     date  time  domain       activity
0   1  20thdec     2  amazon  add to basket
1   1  21stdec     2  amazon   product view
2   1  21stdec     3  amazon  add to basket
3   1  21stdec     4  amazon  add to basket
5   2  21stdec     4  amazon  add to basket

解释 :

print(df.groupby('id')['activity'].transform('nunique'))
0    2
1    2
2    2
3    2
5    1
6    1
Name: activity, dtype: int64

print(df['Unique'].ne(1))
0     True
1     True
2     True
3     True
5    False
6    False
Name: Unique, dtype: bool

# After the line df.loc[mask,'Unique'] = df.loc[mask,'Unique'].cumsum()
print(df['Unique'])
0    2
1    4
2    6
3    8
5    1
6    1
Name: Unique, dtype: int64

推荐阅读