我想计算一列中的两行与新列之间的差异
(Y(A1)/X(A1))-(Y(A1)/X(A1))/(Y(A1)/X(A1))*100% (3/52-1/41)/(1/41)*100% = 57.72%
附加的代码可以正常工作,但最后一行由于某种原因被删除
c = c.rename(lambda x: (x)*2+1)
c = c.map('{:,.2f}%'.format)
df['Z']=c
预期结果:
X Y Z
A1 41 1
A2 52 3 57.72%
B1 74 6
B2 74 4 -50.00%
C1 5 0
C2 5 0 nan%
D1 120 7
D2 131 7 -9.17%
我实际得到的是:
X Y Z
A1 41 1
A2 52 3 57.72%
B1 74 6
B2 74 4 -50.00%
C1 5 0
C2 5 0 nan%
D1 120 7
D2 131 7
最佳答案
使用GroupBy.pct_change
按由 numpy.arange
创建的 1d 数组的整数除法创建的每 2 行的组:
print (np.arange(len(df)) // 2)
[0 0 1 1 2 2 3 3]
df['Z1'] = df['X'].div(df['Y']).groupby(np.arange(len(df)) // 2).pct_change().mul(-100)
print (df)
X Y Z Z1
A1 41 1 NaN NaN
A2 52 3 57.72% 57.723577
B1 74 6 NaN NaN
B2 74 4 -50.00% -50.000000
C1 5 0 NaN NaN
C2 5 0 nan% NaN
D1 120 7 NaN NaN
D2 131 7 -9.17% -9.166667
另一个解决方案:
s1 = df['X'].div(df['Y'])
df['Z1'] = (1-s1[1::2] / s1[::2].values).mul(100)
print (df)
X Y Z Z1
A1 41 1 NaN NaN
A2 52 3 57.72% 57.723577
B1 74 6 NaN NaN
B2 74 4 -50.00% -50.000000
C1 5 0 NaN NaN
C2 5 0 nan% NaN
D1 120 7 NaN NaN
D2 131 7 -9.17% -9.166667
如果需要不匹配值的缺失值,请使用 map
和 if-else
以避免将缺失值转换为字符串:
s = df['X'].div(df['Y']).groupby(np.arange(len(df)) // 2).pct_change().mul(-100)
df['Z1'] = s.map(lambda x: '{:,.2f}%'.format(x) if x == x else np.nan)
print (df)
X Y Z Z1
A1 41 1 NaN NaN
A2 52 3 57.72% 57.72%
B1 74 6 NaN NaN
B2 74 4 -50.00% -50.00%
C1 5 0 NaN NaN
C2 5 0 nan% NaN
D1 120 7 NaN NaN
D2 131 7 -9.17% -9.17%
关于python - 根据另一列中的 2 行计算列行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56313933/