2017-07-26 2 views
2

J'ai la trame de données suivante.Colonnes de chaînes inversées dans une base de données de sous-ensembles pandas

ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 0|8 2|0 
2 3 DE 2|4 6|6 3|1 
3 4 ES 3|9 1|2 4|2 

Les colonnes Alice et Bob contiennent des valeurs de chaîne. Je souhaite inverser les chaînes de ces colonnes en fonction de la valeur d'une autre colonne. Par exemple, lorsque LOC == ES, inversant les chaînes dans les colonnes correspondantes ressemblerait à ceci:

ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 0|2 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 2|4 

Y at-il un moyen rapide pour effectuer cette opération sur toutes les lignes correspondant dans un fichier csv avec des rangées de milliers?

Merci.

+1

Vos données souhaitées REGLER contredit votre description, Pouvez-vous préciser si vous voulez inverser les chaînes dans la colonne «Karen»? – MaxU

+1

Est-ce juste Alice et Bob? Ou est-ce Karen aussi? –

Répondre

2

Utilisez df.loc pour obtenir vos tranches de ligne, puis appliquez chaîne inverse [::-1] opération sur les colonnes Alice et Bob avec df.applymap.

In [533]: df.loc[df['LOC'] == 'ES', ['Alice', 'Bob']] = \ 
       df.loc[df['LOC'] == 'ES', ['Alice', 'Bob']].applymap(lambda x: x[::-1]) 

In [534]: df 
Out[534]: 
    ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 2|0 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 4|2 
3
#cols = ['Alice','Bob'] 
In [17]: cols = df.columns.drop(['ID','LOC']) 

In [18]: df.loc[df.LOC=='ES', cols] = df.loc[df.LOC=='ES', cols].apply(lambda x: x.str[::-1]) 

In [19]: df 
Out[19]: 
    ID LOC Alice Bob Karen 
0 1 CH 9|5 6|3 4|4 
1 2 ES 1|1 8|0 0|2 
2 3 DE 2|4 6|6 3|1 
3 4 ES 9|3 2|1 2|4 
+0

Psst ... pas sûr 'Karen' devrait être inversé;) –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ, je dirais oui, quand je vois l'ensemble de données désiré OP ... – MaxU

2

Vous pouvez essayer d'utiliser .apply() comme suit pour votre condition d'exemple où la colonne LOC == 'ES':

df['Alice'] = df[['LOC','Alice']].apply(lambda x: x['Alice'][::-1] if x['LOC'] == 'ES' else x['Alice'], axis=1) 

Note dans ma réponse que [::-1] est un moyen d'inverser une chaîne