我是Python新手,我一直在努力将Excel迁移到pandas,因为它无法运行数十万行。 我在 Excel 中有一个如下所示的表格:
其中 A 列和 B 列是输入,C 列是输出。
C 列的公式为
=IF(B2="new",A2,C3)
如果“状态”等于"new",结果将是 A 列中的值
如果“Status”不等于“new”,结果将是 C 的前一行
我尝试使用此代码使用 np.where
和 .shift(-1)
来完成此操作
df['Previous'] = np.where (df['Status']=='new', df['Count'], df['Previous'].shift(-1))
但我似乎收到了这个错误 关键错误:“上一个” 看来我需要先定义“上一页”列。
我尝试搜索 Stack Overflow,但大多数时候相关解决方案都基于复杂的问题,我无法将其模式化为我的简单问题。
df.columns
看起来像
Index(['计数', '状态'], dtype='object')
这是我的代码运行后的结果。
最佳答案
由于您正在创建新列 Previous
当您在 np.where()
中的自身定义中使用该列时,该列仍未定义。语句,你会得到一个错误。
此外,您的问题实际上并不是采用“前一个”值,因为当您处理第一行时,第一行没有前一个值,甚至在处理第二行和第三行时直到我们转到第四行,值仍然没有定义。
因此,解决方案需要在处理仍具有未知值的行时设置一种临时的非确定性值,并在定义某些值后设置这些非确定性值。在这种情况下,我们可以将这些临时的不确定值设置为 np.nan
然后使用 .bfill()
回填之后定义值。我们使用向后填充,因为我们要通过索引 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)
在上面的代码中。
或者,您也可以使用 .where()
一步完成此操作在专栏Count
,而不是 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
同样,无需使用.astype(int)
在上面的代码中,如果列 Count
是字符串类型。
.where()
是:“替换条件为 False 的值”。这在某种程度上相当于“保留条件为 True 的值”。因此,当条件为 True 时,我们使用原始 Count
的值。柱子。然后,您可能会问:“如果条件为 False 该怎么办?要替换什么值?”答案可以从 official document
看出可以从显示 other=nan
的第二个参数中找到。当条件为False时,第二个参数中指定的值other
(如果有的话)将被使用。如果不指定第二个参数,则默认为 nan
。因此,在我们的例子中,当条件为 False 时,我们不指定第二个参数 nan
将用于值。因此,与我们指定 np.nan
的效果相同对于 np.where()
中的 False 条件打电话。
关于python - 如何使用 np.where 使用先前的行创建新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67043249/