Python 在数据帧中跨多个组应用iterrows逻辑

Python 在数据帧中跨多个组应用iterrows逻辑,python,pandas,dataframe,lambda,pandas-groupby,Python,Pandas,Dataframe,Lambda,Pandas Groupby,我在整个数据集中应用某些逻辑时遇到问题。我能够将逻辑应用于一个小的“组”,但不能应用于所有的组(注意,这些组是由primaryFilter和secondaryFilter组成的)。您是否介意为我指出正确的方向 全部数据 测试数据(第一组) 这是测试的输出 现在,我想将上述逻辑应用于剩余的组100,2和100,3和200,1等等。无需使用ItErrors这里,您可以组主过滤器和secondaryFilter列上的数据框,然后为每个唯一组取累积值列someValue和shift中的值之和通过1向

我在整个数据集中应用某些逻辑时遇到问题。我能够将逻辑应用于一个小的“组”,但不能应用于所有的组(注意,这些组是由
primaryFilter
secondaryFilter
组成的)。您是否介意为我指出正确的方向

全部数据

测试数据(第一组) 这是测试的输出


现在,我想将上述逻辑应用于剩余的组
100,2
100,3
200,1
等等。无需使用
ItErrors
这里,您可以
主过滤器
secondaryFilter
列上的数据框,然后为每个唯一组取累积值列
someValue
shift
中的值之和通过
1
向下定位得到
newColumn
。最后从
constantValuePerGroup
中减去
newColumn
,得到
delta

df_input['newColumn'] = df_input.groupby(['primaryFilter', 'secondaryFilter'])['someValue'].apply(lambda s: s.cumsum().shift(fill_value=0))
df_input['delta'] = df_input['constantValuePerGroup'] - df_input['newColumn']

df_test = df_input[df_input.primaryFilter.isin([100])]
df_test = df_test[df_test.secondaryFilter == 1.0]

df_test['newColumn'] = np.nan

for index,row in df_test.iterrows():

    if index==0:
        print("start")
        df_test.loc[0, 'newColumn'] = 0

    elif index==df_test.shape[0]-1:
        df_test.loc[index, 'newColumn'] = df_test.loc[index-1, 'newColumn'] + df_test.loc[index-1, 'someValue']
        print("end")

    else:
        print("inter")
        df_test.loc[index, 'newColumn'] = df_test.loc[index-1, 'newColumn'] + df_test.loc[index-1, 'someValue']

df_test["delta"] = df_test["constantValuePerGroup"] - df_test['newColumn']
df_test.head()
df_input['newColumn'] = df_input.groupby(['primaryFilter', 'secondaryFilter'])['someValue'].apply(lambda s: s.cumsum().shift(fill_value=0))
df_input['delta'] = df_input['constantValuePerGroup'] - df_input['newColumn']
>>> df_input

    primaryFilter  secondaryFilter  constantValuePerGroup  someValue  newColumn  delta
0             100                1                     15          3          0     15
1             100                1                     15          1          3     12
2             100                1                     15          4          4     11
3             100                1                     15          7          8      7
4             100                2                     20          9          0     20
5             100                2                     20          9          9     11
6             100                2                     20          2         18      2
7             100                3                     17          7          0     17
8             100                3                     17          3          7     10
9             100                3                     17          7         10      7
10            200                1                     10          6          0     10
11            200                1                     10          4          6      4
12            200                2                     30          7          0     30
13            200                2                     30         10          7     23
14            200                2                     30         10         17     13
15            200                2                     30          3         27      3
16            200                3                     22          4          0     22
17            200                3                     22          6          4     18
18            200                3                     22          7         10     12
19            200                3                     22          5         17      5