【问题标题】:Create new loop dependent variable by iterating over rows通过迭代行来创建新的循环因变量
【发布时间】:2019-01-09 01:14:53
【问题描述】:

我正在将这段 sas 代码翻译成 pandas。 sas 代码基本上通过一个键对观察进行分组。在每个组中,它创建一个新变量A,其中A[0] = B[0] / C[0] / .25。然后是i >= 1A[i] = A[i - 1] * .85 + B[i] / C[i]BC 是数据框中的其他变量。

我认为没有任何df.groupby().attribute 这样做。

data data;
set data2;
by key1 key2;
retain A;
if first.key1 then A = (B / C) /(.25);
else A = A * .85 + B / C;
run;

组 g01 的预期输出

key1 B C A
g01  1 2 2       2     = 1 / 2 /.25
g01  2 1 3.7     3.7   = 2   * .85 + 2 / 1
g01  2 4 3.645   3.645 = 3.7 * .85 + 2 / 4

我一直在考虑首先获取组键并遍历这些组名。但也许有更好的方法?

【问题讨论】:

  • 请提供您的示例输入和输出,有人可以帮助您
  • 您可以检查您可以通过 groupby 传递的应用功能,但是我们需要示例数据和@Kiran 所说的输出来重现问题并提出任何解决方案。 :)
  • 您好,谢谢!我添加了预期的输出。各位大佬可以看一下吗?

标签: python pandas sas


【解决方案1】:

以下解决方案使用 pd.iterrows(),假设您有一个 DataFrame df,其中包含保存值的列 BC,以及保存组名称的列 key1

g = None
for i, r in df.iterrows():
    if g != r.key1:
        a = r.B / r.C / .25
    else:
        a = a * .85 + r.B / r.C
    df.loc[i, 'A'] = a
    g = r.key1

由于loop dependency 的存在,不可能以并行方式解决此问题,这可以通过您使用[i - 1] 以及我对变量ag 的缓存来表示。

【讨论】:

  • 感谢您的帮助!两个问题:1。这是否按组工作?该程序似乎遍历了整个数据框。 2. 不是“if not a”,而是“if a”?每组中第一个的 a 的计算应该与该组的其余部分不同
  • 1.是的,现在可以了。我重读了你的问题并调整了答案。 2. if not a 是正确的,!= 检查组更改是正确的。您可能需要先按组对数据帧进行排序才能使其正常工作。
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2013-01-14
  • 2023-02-23
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多