根据另一列中的2行计算列

时间:2019-05-26 13:29:27

标签: python pandas pandas-groupby

我想计算一列中两行与新列之间的差异

(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

1 个答案:

答案 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

如果需要缺失值以获取不匹配的值,请使用mapif-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%