如何根据每行变化的条件对列执行加法?

时间:2019-04-29 13:31:40

标签: python pandas dataframe

我有一个数据处理问题,希望有人可以提供帮助。

我在数据框中有两列:

A               B
111            5.2
EF             5.6
DG             5.1
LK             5.4
111            5
EF             5.2

我想创建第3列C列,每当在a列中显示111时,我想从B列减去5的差值,直到显示下一个111列。

所以看起来像这样

A               B            C
111            5.2         5 (minus 0.2)
EF             5.6         5.4 (minus 0.2)
DG             5.1         4.9 (minus 0.2
LK             5.4         5.2 (minus 0.2)
111            5            5 (no change needed as already 5)
EF             5.2          5.2 (no change needed as previous 111 already 5)

因此,如果列A中的111在列B中的值为5.2,则(5-5.2 = -0.2)因此C = 5.2 + -0.2 = 5 如果列A中的111在列B中的值为4.8,则(5-4.8 = 0.2)因此C = 4.8 + 0.2 = 5 直到找到下一个111。

希望这是有道理的。本质上,111是应该为5的标准。如果不是5,那么我想将差异应用于行B中的所有值,直到找到新的111。 有什么建议吗?

3 个答案:

答案 0 :(得分:3)

在使用transform创建组密钥之后,我正在使用cumsum

df['C']=df.B-(df.groupby(df.A.eq('111').cumsum()).B.transform('first')-5)
df
Out[662]: 
     A    B    C
0  111  5.2  5.0
1   EF  5.6  5.4
2   DG  5.1  4.9
3   LK  5.4  5.2
4  111  5.0  5.0
5   EF  5.2  5.2

答案 1 :(得分:1)

您应该只可以使用np.whereffill

df['C'] = np.where(df['A'] == '111', 5 - df['B'], np.nan)
df['C'] = df['C'].ffill()
df['C'] = df['B'] - abs(df['C'])


     A    B    C
0  111  5.2  5.0
1   EF  5.6  5.4
2   DG  5.1  4.9
3   LK  5.4  5.2
4  111  5.0  5.0
5   EF  5.2  5.2

答案 2 :(得分:-1)

这是一个非常特殊的问题,因此答案不是很笼统。在其他情况下,使用apply函数可能很有意义。但是,这里只是:

df = pd.DataFrame(columns=['A', 'B'])
df.A = [111, 'EF', 'DG', 'LK', 111, 'EF']
df.B = [5.2, 5.6, 5.1, 5.4, 5, 5.2]

diff = 0
df['C'] = np.nan
for i in range(len(df)):
    if df.A[i] == 111:
        diff = 5 - df.B[i]
    df.loc[i, 'C'] = df.B[i] + diff
print(df)