我有一个数据框df:
@Component
public class DeleteDocumentByIdFlowAdapter extends IntegrationFlowAdapter {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
private AbstractRequestHandlerAdvice exceptionProviderAdvice;
@Autowired
private MessageChannel moveToCezar;
@Override
protected IntegrationFlowDefinition<?> buildFlow() {
return from("estatement.delete-by-id")
.log(LoggingHandler.Level.DEBUG, "estatement.delete-by-id")
.handle(Jpa.retrievingGateway(this.entityManagerFactory).entityClass(Document.class).idExpression("payload"), c -> c.advice(exceptionProviderAdvice))
.channel(moveToCezar)
;
}
}
我想在数据帧df中添加一列“ c1”,以便根据某些条件填充该列中的空白。
如果该特定站点中的单元名称以“ A”或“ N”结尾,请检查npv / scpci列的值,该值可以被3整除。 无论两列中的哪个值都可被3整除,请将其更新为c1, 以及同一站点中以“ B”,“ C”,“ O”,“ P”结尾的相应单元格应使用与更新“ A”或“ N”相同的列值进行更新。 如果两个值都可以被3整除,则复制npv列值。
如果该站点只有1个单元格而无论以任何字母结尾,请更新可被3整除的值。
必需的输出:
Site cells Azimut technology npv scpci
T30264 G30264B 130 UMTS900 343 276
T30992 G30992A 10 UMTS900 171 12
T30992 G30992B 260 UMTS900 173 13
T30992 U30992A 10 UMTS2100 171 12
T30992 U30992B 260 UMTS2100 173 13
T31520 G31520A 0 UMTS900 72 500
T31520 G31520B 120 UMTS900 73 501
T31520 G31520C 220 UMTS900 74 502
T31548 G31548A 30 UMTS900 93 450
T31548 G31548B 130 UMTS900 94 451
T31548 G31548C 250 UMTS900 95 452
T31548 U31548N 30 UMTS2100 94 450
T31548 U31548O 130 UMTS2100 95 451
T31548 U31548P 250 UMTS2100 96 452
答案 0 :(得分:2)
这是一种方法。让我们调用您的数据框df
。首先要做的是单元格以A或N结尾的情况。
# create the mask when finisig by A or N
mask_AN = (df['cells'].str[-1] == 'A') | (df['cells'].str[-1] == 'N')
# create the column final_value and write
# 1 if the value should be from the column npv and
#2 if the value should be from the column scpci
df.loc[mask_AN,'final_value'] = pd.np.where((df.loc[mask_AN,'scpci']%3 == 0)
& (df.loc[mask_AN,'npv']%3 != 0),2,1)
np.where
的工作方式是:仅当scpci列可被3整除而不是npv列时,final_value应该来自scpci(因此现在为2),否则final_value将来自npv(因此1 )。
下一步是使用单元格以A或N结尾的值填充同一网站的final_value。可以通过以下方式完成:
df['final_value'] = df.groupby('Site')['final_value'].ffill() # fill forward
请注意,此处的填充有效,因为您似乎在以“ B”或“ C”结尾的单元格之前以“ A”结尾(唯一的情况除外),并且在一个以结尾结尾的单元格以“ N”结尾带“ O”和“ P”。如果您并非始终具有此配置,则此ffill
可能无法正常工作。
最后,您需要使用唯一的行来做网站:
# mask of site with unique cell
df_g = df.reset_index().groupby('Site')
mask_unique = df_g.index.first()[df_g.cells.count() ==1]
# a bit on the same idea than before for adding 1 or 2 in the final_value column
df['final_value'].loc[mask_unique] = pd.np.where((df['scpci'].loc[mask_unique]%3 == 0)
& (df['npv'].loc[mask_unique]%3 != 0),2,1)
现在在final_value列中有1或2,只需替换为关联列中的值即可:
df['final_value'] = pd.np.where( df['final_value'] == 1, df['npv'], df['scpci'])
输出与预期的一样:
Site cells Azimut technology npv scpci final_value
0 T30264 G30264B 130 UMTS900 343 276 276
1 T30992 G30992A 10 UMTS900 171 12 171
2 T30992 G30992B 260 UMTS900 173 13 173
3 T30992 U30992A 10 UMTS2100 171 12 171
4 T30992 U30992B 260 UMTS2100 173 13 173
5 T31520 G31520A 0 UMTS900 72 500 72
6 T31520 G31520B 120 UMTS900 73 501 73
7 T31520 G31520C 220 UMTS900 74 502 74
8 T31548 G31548A 30 UMTS900 93 450 93
9 T31548 G31548B 130 UMTS900 94 451 94
10 T31548 G31548C 250 UMTS900 95 452 95
11 T31548 U31548N 30 UMTS2100 94 450 450
12 T31548 U31548O 130 UMTS2100 95 451 451
13 T31548 U31548P 250 UMTS2100 96 452 452