熊猫,根据条件在另一列中搜索结果

奈姆汗

我正在使用熊猫库从.json文件读取数据。我有以下示例数据集:

import pandas as pd

df = pd.DataFrame([['1', 'book1'],
                   ['1', 'book2'],
                   ['1', 'book6'],
                   ['2', 'book1'],
                   ['2', 'book6'],
                   ['2', 'book3'],
                   ['3', 'book4'],
                   ['3', 'book2'],
                   ['4', 'book3'],
                  ],
                  columns=['visitor_id', 'bookid'])

该数据集显示了user_id以及该用户阅读过的书。我的问题是,是否可以根据给定的书本价值过滤掉其他用户阅读过的书本清单?例如,其他用户阅读过哪些其他书,也阅读了书1。因此,如果我要搜索“书1”,则结果应为“书6”,“书3”和“书2”。

是否可以使用任何熊猫函数直接执行此操作?我在文档中找到的最接近的是groupby()函数,但无法正常工作。我想避免使用循环遍历每个值,因为我的数据集很大。

耶斯列尔

您可以过滤所有visitor_id哪里是比赛面膜m通过比较Series.eq,然后过滤原visitor_idSeries.isin和最后一个过滤器,而不各组m由倒它面具~到系列,再到唯一列表:

m = df['bookid'].eq('book1')
a = df.loc[df['visitor_id'].isin(df.loc[m, 'visitor_id']) & ~m, 'bookid'].unique().tolist()
print (a)
['book2', 'book6', 'book3']

或者,您可以使用GroupBy.transformwithGroupBy.any与每个组至少进行一次匹配测试:

m = df['bookid'].eq('book1')
a = df.loc[m.groupby(df['visitor_id']).transform('any')  & ~m, 'bookid'].unique().tolist()
print (a)
['book2', 'book6', 'book3']

说明

首先将值与布尔掩码比较:

m = df['bookid'].eq('book1') 
print (m)
0     True
1    False
2    False
3     True
4    False
5    False
6    False
7    False
8    False
Name: bookid, dtype: bool

然后过滤visitor_id它是组合boolean indexing

print (df[m])
  visitor_id bookid
0          1  book1
3          2  book1

DataFrame.loc由面罩和列名,在这里过滤visitor_idSeries

print (df.loc[m, 'visitor_id'])
0    1
3    2
Name: visitor_id, dtype: object

现在再次根据中的值Series进行过滤,以按组获取所有行:

print (df['visitor_id'].isin(df.loc[m, 'visitor_id']))
0     True
1     True
2     True
3     True
4     True
5     True
6    False
7    False
8    False
Name: visitor_id, dtype: bool

但是因为要删除带有mask的行m,所以首先对True-> False,False-> True映射反转掩码:

print (~m)
0    False
1     True
2     True
3    False
4     True
5     True
6     True
7     True
8     True
Name: bookid, dtype: bool

并通过链&按位AND

print (df['visitor_id'].isin(df.loc[m, 'visitor_id']) & ~m)
0    False
1     True
2     True
3    False
4     True
5     True
6    False
7    False
8    False
dtype: bool bookid

此掩码用于过滤器bookid列:

print (df.loc[df['visitor_id'].isin(df.loc[m, 'visitor_id']) & ~m, 'bookid'])
1    book2
2    book6
4    book6
5    book3
Name: bookid, dtype: object

最后是转换Series为唯一数组并列出:

print (df.loc[df['visitor_id'].isin(df.loc[m, 'visitor_id']) & ~m, 'bookid'].unique().tolist())
['book2', 'book6', 'book3']

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据另一列中的条件填充熊猫

如何使用大熊猫中的groupby根据另一列中的条件计算百分比总数

熊猫根据另一列中的值替换值

熊猫:创建新列,条件是对一列的子字符串搜索和另一列的逆搜索

熊猫根据选择为条件的另一列中的值创建一列

根据熊猫中数据框的另一列的值添加一列

根据另一列的条件创建熊猫列

如何根据熊猫另一列中的条件生成具有值的新列

如何根据Pandas中另一列的条件比较同一列中的日期?

根据条件将一列中的值替换为另一列中的值

熊猫:根据另一列中的条件更改该列的先前单元格值

根据熊猫中的另一列计算一列的平均值

根据条件在熊猫数据框中创建一列

根据另一列的条件加入

根据另一列中的条件修改一列中的值的快捷方式

快速搜索熊猫数据框并根据条件在数据框的另一列中插入值

根据条件填充另一列(熊猫)的空值

根据条件将一列中的条目替换为另一列中的条目

根据另一列的结果减去DataFrames中的列

用另一列的条件填充一列并移动熊猫中的值

如何根据熊猫中另一列的下限值对一列中的值求和?

熊猫根据条件将一列映射到另一列

如何根据另一列的值对列进行熊猫分组并获得每组的特定结果?

如果条件满足熊猫,则根据另一列的升序向列添加字符

如何根据条件在熊猫中创建另一列?

如何根据另一列中满足的条件在熊猫数据框中添加新列?

熊猫根据另一列的条件重置 cumsum()

根据另一列中满足的条件进行过滤

根据R中另一列的条件从一列中删除重复项

TOP 榜单

热门标签

归档