我想计算一列中两行与新列之间的差异
(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
答案 0 :(得分:2)
对于GroupBy.pct_change
创建的1d数组的整数除法创建的每2行,按组使用numpy.arange
:
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%