计数直到在 Pandas 内达到条件

Count until condition is reached in Pandas

我需要你的一些意见。我的想法是,我想看看需要多长时间(以行为单位)才能看到

  1. SUB_B1 列中的新值,并且
  2. SUB_B2
  3. 中的新值

即中间有多少步

  1. SUB_A1SUB B1,以及
  2. 介于 SUB A2SUB B2
  3. 之间

我将数据结构化如下:(我按结果列降序排列索引。之后我将索引 B 和 A 分开并将它们放在新列中)

df.sort_values(['A','result'], ascending=[True,False]).set_index(['A','B'])
result SUB_A1 SUB_A2 SUB_B1 SUB_B2
A B
10_125 10_173 0.903257 10 125 10 173
10_332 0.847333 10 125 10 332
10_243 0.842802 10 125 10 243
10_522 0.836335 10 125 10 522
58_941 0.810760 10 125 58 941
... ... ... ... ... ...
10_173 10_125 0.903257 10 173 10 125
58_941 0.847333 10 173 58 941
1_941 0.842802 10 173 1 941
96_512 0.836335 10 173 96 512
10_513 0.810760 10 173 10 513

这是我到目前为止所做的:(编辑:我想我需要遍历 values[] 但是,我还没有设法超出第一行...)


def func(group):
        if group.SUB_A1.values[0] == group.SUB_B1.values[0]:
            group.R1.values[0] = 1
        else:
            group.R1.values[0] = 0
        if group.SUB_A1.values[0] == group.SUB_B1.values[1] and group.R1.values[0] == 1:
            group.R1.values[1] = 2
        else:
            group.R1.values[1] = 0 

df['R1'] = 0
df.groupby('A').apply(func)

预期结果:

result SUB_B1 SUB_B2 R1 R2
A B
10_125 10_173 0.903257 10 173 1 0
10_332 0.847333 10 332 2 0
10_243 0.842802 10 243 3
10_522 0.836335 10 522 4 0
58_941 0.810760 58 941 0 0
... ... ... ... ... ...

尝试使用 pandas.DataFrame.iterrows and pandas.DataFrame.shift

您可以遍历数据帧并将当前行与前一行进行比较,然后添加一些条件:

df['SUB_A2_last'] = df['SUB_A2'].shift()
count = 0
#Fill column with zeros
df['count_series'] = 0
for index, row in df.iterrows():
    subA = row['sub_A2']
    subA_last = row['sub_A2_last']
    if subA == subA_last:
        count += 1
    else:
        count = 0
    df.loc[index, 'count_series'] = count

然后对 B 列重复上述操作。使用 pandas.DataFrame.apply 和自定义函数可以获得更好的方法。

您是否正在寻找这样的东西:

示例数据框:

df = pd.DataFrame(
    {"SUB_A": [1, -1, -2, 3, 3, 4, 3, 6, 6, 6],
     "SUB_B": [1, 2, 3, 3, 3, 3, 4, 6, 6, 6]},
    index=pd.MultiIndex.from_product([range(1, 3), range(1, 6)], names=("A", "B"))
)
     SUB_A  SUB_B
A B              
1 1      1      1
  2     -1      2
  3     -2      3
  4      3      3
  5      3      3
2 1      4      3
  2      3      4
  3      6      6
  4      6      6
  5      6      6

现在这个

equal = df.SUB_A == df.SUB_B
df["R"] = equal.groupby(equal.groupby("A").diff().fillna(True).cumsum()).cumsum()

导致

     SUB_A  SUB_B  R
A B                 
1 1      1      1  1
  2     -1      2  0
  3     -2      3  0
  4      3      3  1
  5      3      3  2
2 1      4      3  0
  2      3      4  0
  3      6      6  1
  4      6      6  2
  5      6      6  3

噗!极好的!感谢你们的意见


def func(group):
    for each in range(len(group)):
        if group.SUB_A1.values[0] == group.SUB_B1.values[each]:
            group.R1.values[each] = each + 1
            continue
        elif group.SUB_A1.values[0] == group.SUB_B1.values[each] and group.R1.values[each] == each + 1:
            group.R1.values[each] = each + 1
        else:
            group.R1.values[each] = 0
        return group

df['R1'] = 0
df.groupby('A').apply(func)