Индексирование данных из данных в строках индексов строк - PullRequest
1 голос
/ 21 марта 2019

У меня есть два кадра данных Python одинаковой формы, например:

df1 = pd.DataFrame(np.random.randn(3,2), index=np.arange(3), columns=['a','b'] )
df2 = pd.DataFrame(np.random.randint(0, high=3, size=(3,2)), index=np.arange(3), columns=['a','b'] )

print df1
           a            b
0   0.336811    -2.132993
1  -1.492770     0.278024
2  -2.355762    -0.894376

print df2
           a            b
0          1            2
1          0            2
2          2            1

Я хотел бы использовать значения в df2 в качестве индексов строк, чтобы выбрать значения в df1 и создать новый кадр данных равной формы.,Ожидаемый результат:

print df3
           a            b
0  -1.492770    -0.894376
1   0.336811    -0.894376
2  -2.355762     0.278024

Я пытался использовать .loc, и он хорошо работает для одного столбца:

df3 = df1.loc[df2['a'], 'a']

print df3

0  -1.492770    
1   0.336811    
2  -2.355762    

Но я не смог использовать .loc или .iloc на всехколонны одновременно.Я бы хотел избежать циклов для оптимизации производительности, так как я работаю с большим фреймом данных.Есть идеи?

1 Ответ

1 голос
/ 21 марта 2019

Использование numpy выбор

pd.DataFrame([df1[col].values[df2[col]] for col in df1.columns], index=['a','b']).T


    a           b
0   -1.492770   -0.894376
1    0.336811   -0.894376
2   -2.355762    0.278024

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

Например,

df1.T.values.ravel()[df2.T.values.ravel() + np.repeat(np.arange(0, len(df1)+1, len(df1)), len(df1))].reshape(df1.T.shape).T

Придает

array([[-1.49277 , -0.894376],
       [ 0.336811, -0.894376],
       [-2.355762,  0.278024]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...