python - 根据多列条件选择熊猫数据框中的行
问题描述
我有一个数据集如下
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 个活动级别(产品视图和添加到购物篮)
如果造成任何误解,敬请见谅
谢谢
解决方案
IIUC,使用groupby
+transform
并nunique
计算cumsum
不等于 ( ne
)的值1
,然后使用drop_duplicates
withsubset
参数:
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
推荐阅读
- c++ - 如果可能,隐式移动构造函数应为 noexcept
- laravel - Laravel 升级后,.env 变量未定义索引
- javascript - 谷歌表格:数据验证陷入无限“加载”
- c - 将多维数组传递给C中的函数时出现问题
- ssh - 如何将 RSA 私钥转换为 Openssh 私钥
- javascript - 判断数组元素是否是某个数组?JavaScript
- spring - 引起:java.net.SocketException:Spring Batch for Async 中的连接重置
- android - setPixels() 行为异常 - Android 位图
- java - 有条件地结合 Mono 和 Flux
- docker - OpenShift 将文件从容器复制到 PVC