python - 如何使用 np.where 使用先前的行创建新列?

标签 python excel pandas numpy

我是Python新手,我一直在努力将Excel迁移到pandas,因为它无法运行数十万行。 我在 Excel 中有一个如下所示的表格:

enter image description here

其中 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')

这是我的代码运行后的结果。

enter image description here

最佳答案

由于您正在创建新列 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/

相关文章:

python - 如何在 Python 3 中将一个列表中的项目追加到另一个列表

python / Pandas : Find matching values from two dataframes and return third value

Python:合并两个列表以创建一个新列表

excel - 如何在excel中的所有单元格中查找和替换部分公式

python - 使用 AWS S3 s3fs/boto3 读取 h5 文件

excel - 这个 if 语句中的参数怎么太多了

excel - excel可以清理自由文本用户输入吗?

python系列在data frame错误中有歧义

python - pandas matplotlib plot 有奇怪的工件

python - Numpy:如何将 (4, ) 数组和 (9, 9) 数组添加到 (9, 9, 4) 数组?