在有条件的熊猫中除以前一行
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】:
使用replace
和fillna
处理NaN
和Inf
的另一种解决方案:
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
的信息?以上是关于在有条件的熊猫中除以前一行的主要内容,如果未能解决你的问题,请参考以下文章