迭代 groupby 数据帧以在每一行中进行操作

Seb*_*ano 4 python dictionary loops group-by pandas

我有一个像这样的数据帧:

    subject  trial  attended
0         1      1         1
1         1      3         0
2         1      4         1
3         1      7         0
4         1      8         1
5         2      1         1
6         2      2         1
7         2      6         1
8         2      8         0
9         2      9         1
10        2     11         1
11        2     12         1
12        2     13         1
13        2     14         1
14        2     15         1
Run Code Online (Sandbox Code Playgroud)
  1. 我想以 GroupBy 为主题。
  2. 然后在 GroupBy 数据帧的每一行中迭代。
  3. 如果对于一行 'attended' == 1,则将变量 sum_reactive 增加 1。
  4. 如果 sum_reactive 变量达到 == 4,则将变量 sum_reactive 达到 4 的“主题”和“试验”添加到字典中。

我试图为此定义一个函数,但它不起作用:

def count_attended():
    sum_reactive = 0
    dict_attended = {}
    for i, g in reactive.groupby(['subject']):
        for row in g:
            if g['attended'][row] == 1:
                sum_reactive += 1
                if sum_reactive == 4:
                   dict_attended.update({g['subject'] : g['trial'][row]})
                   return dict_attended

    return dict_attended
Run Code Online (Sandbox Code Playgroud)

我认为我不清楚如何在每个 GroupBy 数据帧内进行迭代。我是使用熊猫的新手。

Sco*_*ton 5

IIUC尝试,

df = df.query('attended == 1')
df.loc[df.groupby('subject')['attended'].cumsum() == 4, ['subject', 'trial']].to_dict(orient='record')
Run Code Online (Sandbox Code Playgroud)

输出:

[{'subject': 2, 'trial': 9}]
Run Code Online (Sandbox Code Playgroud)

使用groupbywithcumsum将进行计数,然后检查此值何时等于 4 以创建布尔系列。您可以使用此布尔系列进行布尔索引以将数据框过滤到某些行。最后,通过锁定和列过滤选择主题和试验。