我有一个数据处理问题,希望有人可以提供帮助。
我在数据帧中有两列:
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。对此有何建议?
你应该只能使用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
我在使用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
这是一个非常特殊的问题,所以答案不是很一般。在其他情况下,使用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)