Выберите столбец из строк DataFrame, используя список меток столбцов - PullRequest
0 голосов
/ 17 января 2019

У меня есть список значений с индексом столбца, который я хочу для каждой строки в панде DataFrame. Как мне сопоставить этот список меток столбцов с каждой строкой DataFrame?

Если я просто проиндексирую DataFrame, используя список, весь список будет применен к каждой строке, как это.

In [10]: df = pd.DataFrame(np.random.randn(5,2), columns=list('AB'))

In [11]: df
Out[11]: 
          A         B
0 -0.082240 -2.182937
1  0.380396  0.084844
2  0.432390  1.519970
3 -0.493662  0.600178
4  0.274230  0.132885

In[12]: selection = list('ABBAA')

In[13]: selection
Out[13]: ['A', 'B', 'B', 'A', 'A']

In[14]: df[selection]
Out[14]:
          A         B         B         A         A
0 -0.082240 -2.182937 -2.182937 -0.082240 -0.082240
1  0.380396  0.084844  0.084844  0.380396  0.380396  
2  0.432390  1.519970  1.519970  0.432390  0.432390
3 -0.493662  0.600178  0.600178 -0.493662 -0.493662
4  0.274230  0.132885  0.132885  0.274230  0.274230

Каждый элемент в списке выбора указывает столбец для выбора из соответствующей строки в кадре данных. В этом примере я хочу столбец A из первого ряда, B из второго и третьего, затем A из четвертого и пятого. Получается, что это диагональ вышеприведенного результата. Мой фактический DataFrame намного больше, и я не думаю, что имеет смысл строить приведенный выше результат просто для выбора диагонали.

Конечно, я могу достичь этого, циклически перебирая строки, но я ожидаю, что у Панд есть встроенный способ сделать это. Я ищу метод, чтобы получить следующий результат.

In[15]: df <do something> selection
Out[15]:
0 -0.082240
1  0.084844
2  1.519970
3 -0.493662
4  0.274230

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Я могу думать только о numpy методе

pd.Series(df.values[df.index,df.columns.get_indexer(selection)])
Out[563]: 
0   -0.082240
1    0.084844
2    1.519970
3   -0.493662
4    0.274230
dtype: float64
0 голосов
/ 17 января 2019

IIUC, попробуйте это

df[selection].values.diagonal()

Если вам нужно в форме Series, как вы отметили, выполните -

pd.Series(df[selection].values.diagonal())
0 голосов
/ 17 января 2019

Вы разбиваете фрейм данных дважды, если сначала выбираете столбцы на основе выбора, а затем получаете диагональные значения. Вместо этого вы можете использовать lookup , который возвращает массив значений, соответствующих каждой паре (строка, столбец).

df.lookup(df.index, selection)

array([-0.08224 ,  0.084844,  1.51997 , -0.493662,  0.27423 ])

Если вы хотите получить данные в виде серии панд,

pd.Series(df.lookup(df.index, selection))

0   -0.082240
1    0.084844
2    1.519970
3   -0.493662
4    0.274230
0 голосов
/ 17 января 2019

Используйте reindex:

df.reindex(selection, axis=1)

Выход:

          A         B         B         A         A
0  0.065447 -1.890299 -1.890299  0.065447  0.065447
1  0.389780  0.301049  0.301049  0.389780  0.389780
2  0.484159 -1.311432 -1.311432  0.484159  0.484159
3 -0.209745 -2.233050 -2.233050 -0.209745 -0.209745
4 -0.093495 -1.527827 -1.527827 -0.093495 -0.093495

Затем используйте np.eye и mask

df.reindex(selection, axis=1).mask(np.eye(5) == 0).stack()

Выход:

0  A    0.065447
1  B    0.301049
2  B   -1.311432
3  A   -0.209745
4  A   -0.093495
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...