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

2024-10-03 06:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的数据集中有一个新的列,当标识符与当前行中的操作相同时,显示前面的操作。你知道吗

到目前为止,我已经尝试通过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

Tags: 数据代码dfshiftdef标识符rowabc
3条回答

假设你有熊猫,像这样的东西应该工作。你知道吗

trial['newAgg'] = trial.groupby(['identifier'])['aggregation'].apply(lambda x: (x + '-').cumsum().str.strip())

*编辑:*根据您的代码片段,这应该适用于trial["newAgg"]无需编写else

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'])]

您可以将pandas goupbyapply一起使用,让一个自定义函数来完成这项工作,而不是循环。
在这个例子中,我使用了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

据我所知,else语句在初始化newID之前就被触发了,导致它等于下一行的“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"]

或者类似的东西。恕我直言,我很少和熊猫和Python玩。你知道吗

祝你好运!你知道吗

相关问题 更多 >