Python 更新循环中的一行,然后在下一次迭代中使用更新的值

Python 更新循环中的一行,然后在下一次迭代中使用更新的值,python,pandas,Python,Pandas,我希望在我的数据集中有一个新列,当标识符与当前行中的操作相同时,该列显示前面的操作 到目前为止,我已经尝试循环使用df,但这只捕获前面的行,而不是每个组中的所有行 从如下数据开始: requestTime identifier aggregation 38:00.5 123 abc 38:02.2 123 def 38:03.9 123 ghi 38:04.9 456

我希望在我的数据集中有一个新列,当标识符与当前行中的操作相同时,该列显示前面的操作

到目前为止,我已经尝试循环使用df,但这只捕获前面的行,而不是每个组中的所有行

从如下数据开始:

requestTime     identifier  aggregation
38:00.5         123         abc
38:02.2         123         def
38:03.9         123         ghi
38:04.9         456         abc
这是我迄今为止尝试过的代码:

trial["newAgg"] = trial["aggregation"].shift(1)
trial["newId"] = trial["identifier"].shift(1)

for index, row in trial.iterrows():
    if row.identifier == row.newId:
        trial["newAgg"] + " - " + trial["aggregation"]
    else:
        trial["newAgg"] = trial["aggregation"]
哪些产出:

requestTime identifier  aggregation newAgg              newId
38:00.5     123         abc         abc 
38:02.2     123         def         abc - def           123
38:03.9     123         ghi         def - ghi           123
38:04.9     456         abc         abc                 456
但我希望输出如下:

requestTime identifier  aggregation newAgg              newId
38:00.5     123         abc         abc 
38:02.2     123         def         abc - def           123
38:03.9     123         ghi         abc - def - ghi     123
38:04.9     456         abc         abc                 456

据我所知,在初始化newID之前,else语句在开始时被触发,导致它等于下一行的“def”

如果您希望abc预先初始化,然后再添加,那么最好将其作为上面的变量,然后再添加以下更改

trial["newAgg"] = trial["aggregation"].shift(1)
trial["newId"] = trial["identifier"].shift(1)
abcHold = "abc"

for index, row in trial.iterrows():
    if row.identifier == row.newId:
        abcHold + " - " + trial["newAgg"] + " - " + trial["aggregation"]
    else:
        trial["newAgg"] = trial["aggregation"]
或者类似的东西。恕我直言,我还没有和熊猫和蟒蛇玩过那么多


祝你好运

假设你有熊猫df,像这样的东西应该可以用

trial['newAgg'] = trial.groupby(['identifier'])['aggregation'].apply(lambda x: (x + '-').cumsum().str.strip())
*编辑:*根据您的代码片段,这应该适用于
试用版[“newAgg”]
无需编写
否则

for index, row in trial.iterrows():
    if row.identifier == row.newId:
        trial["newAgg"] = trial.groupby(['identifier'])['aggregation'].apply(lambda x: (x + '-').cumsum().str.strip())
        trial["newAgg"] = [i[ : -1] for i in list(trial['newAgg'])]

您可以与自定义函数一起使用并让自定义函数来完成任务,而不是循环。
在本例中,我使用了lambda函数

outcol = df.groupby('identifier').apply(lambda x : pd.Series([' - '.join(x['aggregation'].iloc[0:i]) for i in range(1,len(x)+1)]))
outcol.reset_index(drop=True, inplace=True)
df['newAgg'] = outcol
groupby
自动选择数据帧的子集,这些子集具有应用自定义函数的相同的
'identifier'
值。
在本例中,我使用理解列表选择要连接的字符串。
需要使用
reset_index
删除多索引,以便将列连接回原始数据帧

最终结果是:

  requestTime  identifier aggregation           newAgg
0     38:00.5         123         abc              abc
1     38:02.2         123         def        abc - def
2     38:03.9         123         ghi  abc - def - ghi
3     38:04.9         456         abc              abc
您是否尝试过试用[“newAgg”]=试用[“newAgg”]。shift(1)+“-”+试用[“聚合”]