根据条件熊猫在栏中填写空白

时间:2018-06-20 11:34:44

标签: python python-3.x pandas dataframe

我有一个数据框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

1 个答案:

答案 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