Python Pandas-跳过行时是否可以有条件地对另一列进行回填?
我有一个数据帧,需要在其中回填7个位置的值,但我不想这样做,除非其他列中的值大于0。这对熊猫有可能吗?原因中带有1的最后一行是带有1的原始行 我现在使用的代码用于获得7个位置的回填: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:
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之外的所有零开始。用户可以运行此代码。