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