2016-03-23 3 views
1

Я использую Python Pandas для следующего. У меня три кадра данных, df1, df2 и df3. Каждый из них имеет те же размеры, индекс и метки столбцов. Я хотел бы создать четвертый dataframe, который принимает элементы из df1 или df2 в зависимости от значений в df3:Извлечение данных из двух фреймов данных для создания третьего

df1 = pd.DataFrame(np.random.randn(4, 2), index=list('0123'), columns=['A', 'B']) 

df1 

Out[67]: 
     A   B 
0 1.335314 1.888983 
1 1.000579 -0.300271 
2 -0.280658 0.448829 
3 0.977791 0.804459 

df2 = pd.DataFrame(np.random.randn(4, 2), index=list('0123'), columns=['A', 'B']) 
df2 
Out[68]: 
     A   B 
0 0.689721 0.871065 
1 0.699274 -1.061822 
2 0.634909 1.044284 
3 0.166307 -0.699048 

df3 = pd.DataFrame({'A': [1, 0, 0, 1], 'B': [1, 0, 1, 0]}) 
df3 
Out[69]: 
    A B 
0 1 1 
1 0 0 
2 0 1 
3 1 0 

Новый dataframe, df4, имеет тот же индекс и столбцов метки и принимает элемент из df1, если соответствующее значение в df3 - 1. Он принимает элемент от df2, если соответствующее значение в df3 - это номер 0.

Мне нужно решение, которое использует общие ссылки (например, ix или iloc), а не фактические метки столбцов и значения индекса, потому что у моего набора данных пятьдесят столбцов и четыреста строк.

ответ

1

Как ваш DataFrames случится быть числовыми, а матрица селектора случается из индикаторных переменных, вы можете сделать следующее:

>>> pd.DataFrame(
    df1.as_matrix() * df3.as_matrix() + df1.as_matrix() * (1 - df3.as_matrix()), 
    index=df1.index, 
    columns=df1.columns) 

Я пытался это я и это работает. Как ни странно, ответ Якыма Пироженко, который я считаю превосходным, не работает и мной.

+0

Ваш метод работает. Во второй части формулы есть небольшая опечатка, но ситакс выполняет эту работу. Спасибо pd.DataFrame ( df1.as_matrix() * df3.as_matrix() + df2.as_matrix() * (1 - df3.as_matrix()), index = df1.index, columns = df1.columns) – Vijay

1

df4 = df1.where(df3.astype(bool), df2) должен это сделать.

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(np.random.randint(10, size = (4,2))) 
df2 = pd.DataFrame(np.random.randint(10, size = (4,2))) 
df3 = pd.DataFrame(np.random.randint(2, size = (4,2))) 
df4 = df1.where(df3.astype(bool), df2) 

print df1, '\n' 
print df2, '\n' 
print df3, '\n' 
print df4, '\n' 

Выход:

0 1 
0 0 3 
1 8 8 
2 7 4 
3 1 2 

    0 1 
0 7 9 
1 4 4 
2 0 5 
3 7 2 

    0 1 
0 0 0 
1 1 0 
2 1 1 
3 1 0 

    0 1 
0 7 9 
1 8 4 
2 7 4 
3 1 2 
+0

Это решение возвращает копию df2 в df4, то есть df4 идентична df2, а не извлекает элементы из df1 и df2 в зависимости от значений в df3. – Vijay

+0

Сообщите мне, если это работает. Я редактировал в булевой маске явно. –

+0

Привет @Yakym - он все еще не работает. df4 такой же, как df2 – Vijay

Смежные вопросы