在有条件的熊猫中除以前一行

Posted

技术标签:

【中文标题】在有条件的熊猫中除以前一行【英文标题】:Dividing by previous row in pandas with condition 【发布时间】:2020-06-25 14:22:59 【问题描述】:

我正在尝试创建一个新列,它是前一行的划分。但有些行的值为 0。所以我的条件语句是:如果两行之间的除法是无穷大或nan,则Growth rate列的值为0。否则,它将与上一行进行除法。

''' n=len(df) 对于范围内的 j (0,n-1):

if ((df.iloc[j,4]/df.iloc[j-1,4]) == inf):
    df['GrowthRate']=0
else:
    df['GrowthRate'] = df.iloc[j,4]/df.iloc[j-1,4]
    j=j+1

'''

输出是我在列中的所有值都是inf。

【问题讨论】:

df['GrowthRate'] = df.iloc[:, 4].div(df.iloc[:, 4].shift(), axis=0).replace([np.inf, -np.inf], 0).fillna(0) ..? 【参考方案1】:

使用replacefillna处理NaNInf的另一种解决方案:

import numpy as np

df['GrowthRate'] = (df.iloc[:, 4].div(df.iloc[:, 4].shift())
                    .fillna(0).replace([np.inf, -np.inf], 0))

示例

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(-3, 4, (10, 5)))
print(df)

#    0  1  2  3  4
# 0 -3 -3  0  3  0
# 1  0  2  0 -3  2
# 2 -3 -3 -3 -1 -2
# 3  0  0 -1  3  0
# 4  3  2 -3  1  1
# 5 -3  3  1 -2 -2
# 6  2 -1 -2  3  2
# 7  2 -1  3  3  3
# 8  2  1  3  3  1
# 9 -1  0  1 -2  1

df['GrowthRate'] = (df.iloc[:, 4].div(df.iloc[:, 4].shift())
                    .fillna(0).replace([np.inf, -np.inf], 0))

[出]

   0  1  2  3  4  GrowthRate
0 -3 -3  0  3  0    0.000000
1  0  2  0 -3  2    0.000000
2 -3 -3 -3 -1 -2   -1.000000
3  0  0 -1  3  0   -0.000000
4  3  2 -3  1  1    0.000000
5 -3  3  1 -2 -2   -2.000000
6  2 -1 -2  3  2   -1.000000
7  2 -1  3  3  3    1.500000
8  2  1  3  3  1    0.333333
9 -1  0  1 -2  1    1.000000

【讨论】:

【参考方案2】:

如果上面的值为0,则除以np.inf,结果为0,否则除以前一个值

col = df.iloc[:,4]
df['GrowthRate'] = col.div(col.where(col.eq(0), np.inf))

如果需要在最后填写NaN

df['GrowthRate'] = col.div(col.where(col.eq(0), np.inf)).fillna(0)

【讨论】:

当我尝试这个时,我得到了所有 0 的信息?

以上是关于在有条件的熊猫中除以前一行的主要内容,如果未能解决你的问题,请参考以下文章

熊猫将行值除以聚合总和,条件由其他单元格设置

python - 被熊猫条件和/或布尔索引难倒

大熊猫中分组的条件比率

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

大熊猫的条件前向填充

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?