J'ai un df avec deux colonnes number, type. J'essaye de supprimer le nombre en position impaire si type est odd.

Pour le nombre - (7,14,21,28) sans nombres en position odd - 7,21.

De même - (3,10,17,24,31) sans chiffres en position odd - 3,17,31

Df

    df= pd.DataFrame(data = {'number' : ['7,14,21,28', '2', '3,6,5,8 ', '4', '3,10,17,24,31'], 'day' : ['odd', 'even', 'even', 'even', 'odd']}) 


    number          type
0   7,14,21,28      odd
1   2               even   
2   3,6,5,8         even
3   4               even
4   3,10,17,24,31   odd

Ma sortie exceptée:

        number          type
    0   7,21            odd
    1   2               even   
    2   3,6,5,8         even
    3   4               even
    4   3,17,31         odd
2
Zanthoxylum piperitum 25 mai 2020 à 20:47

3 réponses

Meilleure réponse

Vous pouvez utiliser de simples string slicing avec step = 2 :

In [1755]: df.number = np.where(df['day'].eq('odd'), df.number.str.split(',').str[::2].str.join(','), df['number'])

In [1759]: df                                              
Out[1759]: 
     number   day
0      7,21   odd
1         2   even
2   3,6,5,8   even
3         4   even
4   3,17,31   odd
3
Mayank Porwal 25 mai 2020 à 18:12

Vous pouvez utiliser DataFrame.apply fonctionnalité pour calculer le calcul pour chaque ligne.


d = pd.DataFrame(
      data = {'number' : ['7,14,21,28', '2', '3,6,5,8 ', '4', '3,10,17,24,31'],       
      'type' : ['odd', 'even', 'even', 'even', 'odd']})

d['number'] = d.apply(
   lambda row: \
      ", ".join(row['number'].split(',')[::2]) 
      if row['type'] == 'odd' 
      else row['number'], axis=1)

print(d.to_string())

      number  type
0      7, 21   odd
1          2  even
2   3,6,5,8   even
3          4  even
4  3, 17, 31   odd

1
DOOM 25 mai 2020 à 18:02

Essaye ça,

df.loc[df['day'] == "odd", "number"] = df.loc[df['day'] == "odd", "number"]. \
    apply(lambda x : ",".join([str(i) for i in x.split(",") if int(i) % 2 != 0]))

     number   day
0      7,21   odd
1         2  even
2  3,6,5,8   even
3         4  even
4   3,17,31   odd
1
Sushanth 25 mai 2020 à 18:01