Python Pandas-跳过行时是否可以有条件地对另一列进行回填?

Python Pandas-跳过行时是否可以有条件地对另一列进行回填?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,需要在其中回填7个位置的值,但我不想这样做,除非其他列中的值大于0。这对熊猫有可能吗?原因中带有1的最后一行是带有1的原始行 我现在使用的代码用于获得7个位置的回填: s = df.Reason.bfill(limit=7) s.loc[s.notnull() & df.Reason.isnull()] = 1 df['Reason'] = s 输出如下: Time Stamp HP_1H_mean Reason 2019-07-26 07:

我有一个数据帧,需要在其中回填7个位置的值,但我不想这样做,除非其他列中的值大于0。这对熊猫有可能吗?原因中带有1的最后一行是带有1的原始行

我现在使用的代码用于获得7个位置的回填:

s = df.Reason.bfill(limit=7)
s.loc[s.notnull() & df.Reason.isnull()] = 1
df['Reason'] = s
输出如下:

Time Stamp              HP_1H_mean  Reason
2019-07-26 07:00:00     410.637966  0.0
2019-07-26 08:00:00     403.521735  0.0
2019-07-26 09:00:00     403.143925  0.0
2019-07-26 10:00:00     410.542895  0.0
2019-07-26 11:00:00     396.896670  0.0
2019-07-26 12:00:00     0.000000    0.0
2019-07-26 13:00:00     0.000000    0.0
2019-07-26 14:00:00     399.929812  0.0
2019-07-26 15:00:00     0.000000    0.0
2019-07-26 16:00:00     0.000000    0.0
2019-07-26 17:00:00     0.000000    0.0
2019-07-26 18:00:00     0.000000    0.0
2019-07-26 19:00:00     0.000000    0.0
2019-07-26 20:00:00     0.000000    0.0
2019-07-26 21:00:00     390.811179  0.0
2019-07-26 22:00:00     0.000000    0.0
2019-07-26 23:00:00     395.659520  0.0
2019-07-27 00:00:00     0.000000    1.0
2019-07-27 01:00:00     0.000000    1.0
2019-07-27 02:00:00     0.000000    1.0
2019-07-27 03:00:00     0.000000    1.0
2019-07-27 04:00:00     0.000000    1.0
2019-07-27 05:00:00     267.144639  1.0
2019-07-27 06:00:00     266.619800  1.0
2019-07-27 07:00:00     296.005934  1.0
2019-07-27 08:00:00     288.335720  0.0
我尝试过像s.loc[s.notnull&df.Reason.isnull&df.HP_1H_mean!=0]=1这样的变体,尽管这些变体不会引发异常,但它不起作用

预期产出:

Time Stamp              HP_1H_mean  Reason
2019-07-26 07:00:00     410.637966  0.0
2019-07-26 08:00:00     403.521735  0.0
2019-07-26 09:00:00     403.143925  0.0
2019-07-26 10:00:00     410.542895  1.0
2019-07-26 11:00:00     396.896670  1.0
2019-07-26 12:00:00     0.000000    0.0
2019-07-26 13:00:00     0.000000    0.0
2019-07-26 14:00:00     399.929812  1.0
2019-07-26 15:00:00     0.000000    0.0
2019-07-26 16:00:00     0.000000    0.0
2019-07-26 17:00:00     0.000000    0.0
2019-07-26 18:00:00     0.000000    0.0
2019-07-26 19:00:00     0.000000    0.0
2019-07-26 20:00:00     0.000000    0.0
2019-07-26 21:00:00     390.811179  1.0
2019-07-26 22:00:00     0.000000    0.0
2019-07-26 23:00:00     395.659520  1.0
2019-07-27 00:00:00     0.000000    0.0
2019-07-27 01:00:00     0.000000    0.0
2019-07-27 02:00:00     0.000000    0.0
2019-07-27 03:00:00     0.000000    0.0
2019-07-27 04:00:00     0.000000    0.0
2019-07-27 05:00:00     267.144639  1.0
2019-07-27 06:00:00     266.619800  1.0
2019-07-27 07:00:00     296.005934  1.0
2019-07-27 08:00:00     288.335720  0.0

您可以使用内部数据对齐来帮助实现这一点:首先选择“HP_1H_mean”大于零的布尔行,使用限制为7的bfill并将其分配回整列。熊猫将根据索引调整数据库。最后,用零填充

df['Reason']=df.loc[df['HP_1H_mean']>0,“Reason'].bfilllimit=7

如果“原因”中已经存在零,则更新,然后屏蔽这些零

df['Reason'] = df.loc[df['HP_1H_mean'] > 0, 'Reason'].mask(df['Reason'] != 1).bfill(limit=7)

df['Reason'] = df['Reason'].fillna(0)

print(df)
输出:

          Time     Stamp  HP_1H_mean  Reason
0   2019-07-26  07:00:00  410.637966     0.0
1   2019-07-26  08:00:00  403.521735     0.0
2   2019-07-26  09:00:00  403.143925     0.0
3   2019-07-26  10:00:00  410.542895     1.0
4   2019-07-26  11:00:00  396.896670     1.0
5   2019-07-26  12:00:00    0.000000     0.0
6   2019-07-26  13:00:00    0.000000     0.0
7   2019-07-26  14:00:00  399.929812     1.0
8   2019-07-26  15:00:00    0.000000     0.0
9   2019-07-26  16:00:00    0.000000     0.0
10  2019-07-26  17:00:00    0.000000     0.0
11  2019-07-26  18:00:00    0.000000     0.0
12  2019-07-26  19:00:00    0.000000     0.0
13  2019-07-26  20:00:00    0.000000     0.0
14  2019-07-26  21:00:00  390.811179     1.0
15  2019-07-26  22:00:00    0.000000     0.0
16  2019-07-26  23:00:00  395.659520     1.0
17  2019-07-27  00:00:00    0.000000     0.0
18  2019-07-27  01:00:00    0.000000     0.0
19  2019-07-27  02:00:00    0.000000     0.0
20  2019-07-27  03:00:00    0.000000     0.0
21  2019-07-27  04:00:00    0.000000     0.0
22  2019-07-27  05:00:00  267.144639     1.0
23  2019-07-27  06:00:00  266.619800     1.0
24  2019-07-27  07:00:00  296.005934     1.0
25  2019-07-27  08:00:00  288.335720     0.0

您可以使用内部数据对齐来帮助实现这一点:首先选择“HP_1H_mean”大于零的布尔行,使用限制为7的bfill并将其分配回整列。熊猫将根据索引调整数据库。最后,用零填充

df['Reason']=df.loc[df['HP_1H_mean']>0,“Reason'].bfilllimit=7

如果“原因”中已经存在零,则更新,然后屏蔽这些零

df['Reason'] = df.loc[df['HP_1H_mean'] > 0, 'Reason'].mask(df['Reason'] != 1).bfill(limit=7)

df['Reason'] = df['Reason'].fillna(0)

print(df)
输出:

          Time     Stamp  HP_1H_mean  Reason
0   2019-07-26  07:00:00  410.637966     0.0
1   2019-07-26  08:00:00  403.521735     0.0
2   2019-07-26  09:00:00  403.143925     0.0
3   2019-07-26  10:00:00  410.542895     1.0
4   2019-07-26  11:00:00  396.896670     1.0
5   2019-07-26  12:00:00    0.000000     0.0
6   2019-07-26  13:00:00    0.000000     0.0
7   2019-07-26  14:00:00  399.929812     1.0
8   2019-07-26  15:00:00    0.000000     0.0
9   2019-07-26  16:00:00    0.000000     0.0
10  2019-07-26  17:00:00    0.000000     0.0
11  2019-07-26  18:00:00    0.000000     0.0
12  2019-07-26  19:00:00    0.000000     0.0
13  2019-07-26  20:00:00    0.000000     0.0
14  2019-07-26  21:00:00  390.811179     1.0
15  2019-07-26  22:00:00    0.000000     0.0
16  2019-07-26  23:00:00  395.659520     1.0
17  2019-07-27  00:00:00    0.000000     0.0
18  2019-07-27  01:00:00    0.000000     0.0
19  2019-07-27  02:00:00    0.000000     0.0
20  2019-07-27  03:00:00    0.000000     0.0
21  2019-07-27  04:00:00    0.000000     0.0
22  2019-07-27  05:00:00  267.144639     1.0
23  2019-07-27  06:00:00  266.619800     1.0
24  2019-07-27  07:00:00  296.005934     1.0
25  2019-07-27  08:00:00  288.335720     0.0

我想尝试一些不同的东西,所以我使用反向cummax、cumsum和pick行1到8对原因进行切片。最后,将其更新回df


我想尝试一些不同的东西,所以我使用反向cummax、cumsum和pick行1到8对原因进行切片。最后,将其更新回df


您的输入数据帧是什么样子的?最后一行的原因是1,其余的是0还是NaN?@Ben.T我刚试过,这很有道理,但不起作用。看起来仍然像上面的输出,连续的行具有1@ScottBoston输入df与第一个发布的df相同,只是倒数第二行中只有1,其他所有行中都是0。输入数据帧是什么样子的?最后一行的原因是1,其余的是0还是NaN?@Ben.T我刚试过,这很有道理,但不起作用。看起来仍然像上面的输出,连续的行具有1@ScottBoston输入df与第一个发布的df相同,只是倒数第二行中只有1,其他所有内容中都是0。您的代码没有给出与您相同的输出。2019-07-26 10:00:00和11:00:00时仍有0。@QuangHoang I以除最后一个1之外的所有零开始。运行此代码。不知何故,您的代码没有给我与您相同的输出。2019-07-26 10:00:00和11:00:00时仍有0。@QuangHoang I以除最后一个1之外的所有零开始。用户可以运行此代码。