Python 如何使用np.where在使用以前的行创建新列时使用?
我是python新手,我一直致力于将excel迁移到pandas,因为它无法运行数十万行。 我有一个表格,在excel中如下所示: 其中A列和B列为输入,C列为输出。 C列的公式为Python 如何使用np.where在使用以前的行创建新列时使用?,python,excel,pandas,numpy,np,Python,Excel,Pandas,Numpy,Np,我是python新手,我一直致力于将excel迁移到pandas,因为它无法运行数十万行。 我有一个表格,在excel中如下所示: 其中A列和B列为输入,C列为输出。 C列的公式为 =IF(B2=“new”,A2,C3) 如果“状态”等于“新建”,则结果将为A列中的值 如果“Status”不等于“new”,则结果将是C的前一行 我尝试使用np.where和.shift(-1)使用此代码 df['Previous']=np.where(df['Status']=='new',df['Count'
=IF(B2=“new”,A2,C3)
如果“状态”等于“新建”,则结果将为A列中的值
如果“Status”不等于“new”,则结果将是C的前一行
我尝试使用np.where
和.shift(-1)
使用此代码
df['Previous']=np.where(df['Status']=='new',df['Count'],df['Previous'].shift(-1))
但我似乎收到了这个错误
关键错误:“上一个”
似乎我需要先定义“Previous”列
我尝试搜索stackoverflow,但大多数时候相关的解决方案都是基于复杂的问题,我无法将其模式化为我的简单问题
非常感谢你的帮助
这是df列的外观
索引(['Count','Status',dtype='object')
这是我的代码运行一次的结果
由于您正在创建新列
Previous
,并且当您在np.where()
语句的定义中使用此列时,此列仍然没有定义,因此您将得到一个错误
此外,您的问题实际上没有采用“previous”值,因为当您处理第一行时,第一行没有以前的值,即使在处理第二行和第三行时,在我们转到第四行之前,该值仍然没有定义
因此,解决方案需要在处理仍然具有未知值的行时设置一种临时的非确定性值,然后在定义某些值时设置这些非确定性值。在这种情况下,我们可以将这些临时非确定性值设置为np.nan
,然后使用定义的值进行回填。我们使用反向填充,因为我们是通过索引3行上的值来填充索引为0、1、2的行的值
要解决此问题,您可以尝试以下操作:
df['Previous'] = np.where(df['Status']=='new', df['Count'], np.nan)
df['Previous'] = df['Previous'].bfill().astype(int)
print(df)
Count Status Previous
0 4 old 1
1 3 old 1
2 2 old 1
3 1 new 1
4 40 old 10
5 30 old 10
6 20 old 10
7 10 new 10
8 400 old 100
9 300 old 100
10 200 old 100
11 100 new 100
这里,我假设列Count
的数据类型是整数。如果它是字符串类型,则不需要在上面的代码中使用.astype(int)
或者,您也可以在一个步骤中使用on columnCount
,而不是np.where()
,如下所示:
df['Previous'] = df['Count'].where(df['Status'] =='new').bfill().astype(int)
print(df)
Count Status Previous
0 4 old 1
1 3 old 1
2 2 old 1
3 1 new 1
4 40 old 10
5 30 old 10
6 20 old 10
7 10 new 10
8 400 old 100
9 300 old 100
10 200 old 100
11 100 new 100
同样,如果列Count
为字符串类型,则无需在上述代码中使用.astype(int)
是“替换条件为False的值”。这相当于“在条件为真时保留值”。因此,当条件为真时,我们使用原始
Count
列的值。然后,您可能会问:“如果条件为False,将替换什么值?”答案可以从中看到,也可以从显示other=nan
的第二个参数中找到。当条件为False时,将使用第二个参数other
(如果有)中指定的值。如果未指定第二个参数,则默认为nan
。因此,在我们的例子中,我们没有为条件为False时指定第二个参数,nan
将用于值。因此,与我们为np.where()
调用中的假条件指定np.nan
的效果相同。根据您的pic,previous
应该是previous
。您是对的。我确实更改了它,但是,我仍然遇到同样的问题。你能发布df.columns
的输出吗?我将快照粘贴在问题的底部。这就是我打算做的。谢谢你的帮助。非常感谢。对于替代解决方案,我还不能完全理解它,但将回顾.where命令。我还有一个问题,一个不同的场景。如果,我想为每个过去的值添加一个数字,那么生成的“Previous”列如下所示:Previous 4 3 2 1 13 12 11 10 23 22 21 20提前感谢。@ren_exceler为了便于您理解替代解决方案,我在上面添加了一些解释。对于您的附加问题,请详细说明如何获得这些值。对于以“新”为界的每个组,每增加10次?我必须先完全理解标准。谢谢你,@SeaBean。你关于。何处的解释很清楚。我发布了我的第二个问题作为聊天的答案,@SeaBean。抱歉,我不知道如何添加一些图片和表格。