如何根据每行更改的条件对列执行添加?

问题描述 投票:0回答:3

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

我在数据帧中有两列:

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

我想制作一个第3列C,其中每次111都显示在a列中,我想从5列中取出与B列的差值,直到显示下一个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 Etc直到找到下一个111。

希望这是有道理的。基本上111是一个应该是5的标准。如果它不是5那么我想将差异应用于行B中的所有值,直到找到新的111。对此有何建议?

python pandas dataframe
3个回答
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

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
投票

这是一个非常特殊的问题,所以答案不是很一般。在其他情况下,使用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)
© www.soinside.com 2019 - 2024. All rights reserved.