Python 更新循环中的一行,然后在下一次迭代中使用更新的值
我希望在我的数据集中有一个新列,当标识符与当前行中的操作相同时,该列显示前面的操作 到目前为止,我已经尝试循环使用df,但这只捕获前面的行,而不是每个组中的所有行 从如下数据开始: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
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)+“-”+试用[“聚合”]