1
votes

Combinez deux colonnes de données de chaîne en une avec la règle de sélection

Je dois combiner deux colonnes de données de chaîne en une (dans le même DataFrame), j'ai également besoin d'une sorte de règle de sélection, je vous donne un exemple

    nameA   nameB   nameAB
0   martin  NaN     martin
1   peter   NaN     peter
2   john    jhon    jhon
3   tom     tomX    tomX
4   bill    billX   bilX

Cette sortie est le comportement attendu

  import numpy as np
    import pandas as pd
    df = pd.DataFrame({'nameA':['martin', 'peter', 'john', 'tom', 'bill'], 
                       'nameB':[ np.NaN,np.NaN , 'jhon', 'tomX', 'billX']})
    df

    nameA   nameB
0   martin  NaN
1   peter   NaN
2   john    jhon
3   tom     tomX
4   bill    billX

la règle devrait être quelque chose comme ceci:

  1. si A et B sont différents écrire B
  2. si B sont NaN écrire A
  3. si A et B sont NaN écrire NaN

J'ai trouvé des astuces avec des nombres mais pas avec des chaînes, je pense que je dois tester ligne par ligne et obtenir une valeur vraie ou fausse, puis écrire la valeur appropriée

Tout conseil ou assistance serait grandement apprécié!


1 commentaires

Merci à tous, je l'apprécie vraiment


3 Réponses :


0
votes

Utilisez np.where :

    nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX

Production

import pandas as pd
import numpy as np

df = pd.DataFrame({'nameA': ['martin', 'peter', 'john', 'tom', 'bill'],
                   'nameB': [np.NaN, np.NaN, 'jhon', 'tomX', 'billX']})


df['nameAB'] = np.where(pd.isna(df['nameB']), df['nameA'], df['nameB'])

print(df)

Étant donné que vous revenez que vos conditions nameA quand nameB est nan .


0 commentaires

0
votes

Series.fillna
    nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX

Production

df['nameAB'] = df['nameB'].fillna(df['nameA'])
print(df)


0 commentaires

2
votes

Vous pouvez utiliser df.combine_first() :

In [1972]: df['nameAB'] = df.nameB.combine_first(df.nameA)

In [1973]: df
Out[1973]: 
    nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX


2 commentaires

@Karendonseisysiete La réponse a-t-elle fonctionné pour vous?


Oui Mayank, je suis vraiment surpris qu'il existe une méthode qui répond à ma question, merci encore