熊猫嵌套循环,其中一行匹配特定值 - python

给定与特定值匹配的行,迭代数据帧其余部分的最快方法是什么?

例如,假设我有一个带有“日期”,“名称”和“电影”的数据框。可能有很多用户和电影。我希望所有名叫约翰的人都看过与名叫艾丽西亚的人看过同一部电影的人。
输入数据框可能是:

                 date       name              movie
0 2018-01-16 10:33:59     Alicia            Titanic
1 2018-01-17 08:49:13   Chandler             Avatar
2 2018-01-18 09:29:09      Luigi              Glass
3 2018-01-19 09:45:27     Alicia           Die Hard
4 2018-01-20 10:08:05    Bouchra       Pulp Fiction
5 2018-01-26 10:21:47     Bariza              Glass
6 2018-01-27 10:15:32      Peggy         Bumbleblee
7 2018-01-20 10:08:05       John            Titanic
8 2018-01-26 10:21:47     Bariza              Glass
9 2018-01-27 10:15:32       John            Titanic

结果应为:

                 date       name              movie
0 2018-01-16 10:33:59     Alicia            Titanic
7 2018-01-20 10:08:05       John            Titanic
9 2018-01-27 10:15:32       John            Titanic

目前,我正在执行以下操作:

alicias = df[df['Name'] == 'Alicia']

df_res = pd.DataFrame(columns=df.columns)
for i in alicias.index:
    df_res = df_res.append(alicias.loc[i], sort=False)

    df_johns = df[(df['Date'] > alicias['Date'][i])
                 &(df['Name'] == 'John')
                 &(df['Movie'] == alicias['Movie'][i)]

    df_res = df_res.append(df_johns, sort=False)

它可以工作,但是非常慢。我也可以使用groupby来加快速度,但是我希望结果保留初始行(在示例中为“ Alicia”的行),而我找不到使用groupby进行此操作的方法。

有什么帮助吗?

参考方案

这是一种方法。假设您具有以下数据框:

     date      user    movie
0  2018-01-02  Alicia  Titanic
1  2018-01-13    John  Titanic
2  2018-01-22    John  Titanic
3  2018-04-02    John   Avatar
4  2018-04-05  Alicia   Avatar
5  2018-05-19    John   Avatar

IIUC正确的解决方案不应包含第3行,因为Alicia尚未看到Avatar。因此,您可以执行以下操作:

df[df.user.eq('Alicia').groupby(df.movie).cumsum()]

     date       user    movie
0  2018-01-02  Alicia  Titanic
1  2018-01-13    John  Titanic
2  2018-01-22    John  Titanic
4  2018-04-05  Alicia   Avatar
5  2018-05-19    John   Avatar

说明:

以下返回True,其中userAlicia

df.user.eq('Alicia')

0     True
1    False
2    False
3    False
4     True
5    False
Name: user, dtype: bool

您现在可以做的是GroupBy电影,并在组上应用cumsum,因此只有第一个True之后的行也将变为True

0     True
1     True
2     True
3    False
4     True
5     True
Name: user, dtype: bool

最后,在原始数据帧上使用boolean indexation以便选择感兴趣的行。

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

如何用'-'解析字符串到节点js本地脚本? - python

我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…