Индексировать фрейм данных pandas значением в одном из столбцов

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Пример данных:

 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
  

У меня есть фрейм данных pandas, подобный приведенному выше.

Мне нужно создать новый столбец ‘value’, который для каждой строки индексирует значение в столбце в ‘idx’, если оно существует, и возвращает ‘NaN’, если оно не существует.

Мой ожидаемый результат:

           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
  

Комментарии:

1. Вы пробовали это сами?

Ответ №1:

Используйте isin для фильтрации недопустимых имен столбцов, затем используйте DataFrame.lookup для, ну, … «поиска» ваших значений.

 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
  

Ответ №2:

Выполните с

 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