我有一个数据处理问题,希望有人可以提供帮助。
我在数据框中有两列:
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。 有什么建议吗?
答案 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.where
和ffill
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)