Exemples de données:

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
df['idx'] = ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'B', 'C', 'D']
print(df)

          A         B         C idx
0  1.764052  0.400157  0.978738   A
1  2.240893  1.867558 -0.977278   B
2  0.950088 -0.151357 -0.103219   C
3  0.410599  0.144044  1.454274   D
4  0.761038  0.121675  0.443863   A
5  0.333674  1.494079 -0.205158   B
6  0.313068 -0.854096 -2.552990   C
7  0.653619  0.864436 -0.742165   B
8  2.269755 -1.454366  0.045759   C
9 -0.187184  1.532779  1.469359   D

J'ai une trame de données pandas comme ci-dessus.

J'ai besoin de créer une nouvelle colonne 'value' qui pour chaque ligne, indexe la valeur dans la colonne dans 'idx' si elle existe, et retourne 'NaN' si ce n'est pas le cas.

Ma sortie attendue est:

          A         B         C idx     value
0  1.764052  0.400157  0.978738   A  1.764052
1  2.240893  1.867558 -0.977278   B  1.867558
2  0.950088 -0.151357 -0.103219   C -0.103219
3  0.410599  0.144044  1.454274   D  NaN
4  0.761038  0.121675  0.443863   A  0.761038
5  0.333674  1.494079 -0.205158   B  1.494079
6  0.313068 -0.854096 -2.552990   C -2.552990
7  0.653619  0.864436 -0.742165   B  0.864436
8  2.269755 -1.454366  0.045759   C  0.045759
9 -0.187184  1.532779  1.469359   D  NaN
3
Jack M 11 mars 2019 à 23:03

2 réponses

Meilleure réponse

Utilisez isin pour filtrer les noms de colonnes non valides, puis utilisez DataFrame.lookup pour, eh bien, ... "rechercher" vos valeurs.

idx = df.loc[df.idx.isin(df.columns), 'idx']
df.loc[idx.index, 'value'] = df.lookup(idx.index, idx)
df

          A         B         C idx     value
0  1.764052  0.400157  0.978738   A  1.764052
1  2.240893  1.867558 -0.977278   B  1.867558
2  0.950088 -0.151357 -0.103219   C -0.103219
3  0.410599  0.144044  1.454274   D       NaN
4  0.761038  0.121675  0.443863   A  0.761038
5  0.333674  1.494079 -0.205158   B  1.494079
6  0.313068 -0.854096 -2.552990   C -2.552990
7  0.653619  0.864436 -0.742165   B  0.864436
8  2.269755 -1.454366  0.045759   C  0.045759
9 -0.187184  1.532779  1.469359   D       NaN
3
cs95 11 mars 2019 à 20:06

Faire avec

df['value']=np.nan

df['value']=df.values[df.index,df.columns.get_indexer(df.idx)]
df
Out[1130]: 
          A         B         C idx     value
0  0.416356 -1.290687 -0.436484   A  0.416356
1  0.600539  1.107413 -0.100904   B   1.10741
2 -0.455892  0.913249  0.294055   C  0.294055
3 -0.545505 -1.120002 -1.649593   D       NaN
4 -0.710129 -1.563575 -0.343713   A -0.710129
5 -0.684759 -0.554275 -0.400649   B -0.554275
6  0.148388 -0.088781  0.445293   C  0.445293
7  0.974738 -0.444588  0.290779   B -0.444588
8  2.346131  0.084158 -0.855563   C -0.855563
9  0.812868 -1.308031  0.605916   D       NaN
3
BENY 11 mars 2019 à 20:08