2016-11-22 3 views
1

Задача: У меня есть 2 кадра данных df1 и df2. Моя цель состоит в том, чтобы изменить df1, заменив некоторые его значения, если они найдены в пределах df2.Отображение значений в dataframe из другого фрейма данных в Pandas

import pandas as pd 

# dataframe 1 
data = {'A':[90,20,30,25,50,60], 
     'B':['qq','ee','rr','tt','ii','oo'], 
     'C':['XX','VV','BB','NN','KK','JJ']} 
df1 = pd.DataFrame(data) 

# dataframe 2 
convert_table = {'X': ['dd','ee','ff','gg','hh','ii','ll','mm','nn','oo','pp','qq','rr','ss','tt','uu'], 
       'Y': ['DD','VV','FF','GG','HH','KK','LL','MM','NN','JJ','PP','XX','BB','SS','NN','LL'], 
       'Z': [5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61]} 
df2 = pd.DataFrame(convert_table) 

# search values of df1 inside of df2 and replace values 
for idx1,row1 in df1.iterrows(): 
    for idx2, row2 in df2.iterrows(): 
     if row1['B']==row2['X'] and row1['C']==row2['Y']: 
      df1.replace(to_replace=row1['B'],value=row2['Z'],inplace=True) 

Как вы можете видеть, у меня есть 2 для петель и проверить, если общий ряд df1 (row1) находится внутри df2. Если это условие выполнено, то я заменяю значение, содержащееся в строке1 ['B'], содержащееся в row2['Z']

Поэтому результаты, которые я получаю (именно то, что я хотел бы иметь в результате):

In [120]: df1 
Out[120]: 
    A B C 
0 90 43 XX 
1 20 7 VV 
2 30 47 BB 
3 25 59 NN 
4 50 19 KK 
5 60 37 JJ 

Обратите внимание, что столбец B изменен.

Вопрос: Вы могли бы предложить мне лучший способ написать мой код? Я хотел бы сделать это как можно быстрее, используя встроенные функции, предлагаемые Pandas или Python.

Примечание: данные, содержащиеся в dataframes, предназначены только для демонстрации.

ответ

3

Использование слияния двух столбцов:

df1.merge(df2, left_on=['B','C'], right_on=['X','Y'], how='left') 

how='left' The имеет решающее значение здесь. Прочтите Brief primer on merge methods (relational algebra), если вы не понимаете, почему.

Я изменю свой пример, чтобы создать одну, где есть запись в df1, что не существует в df2, что ('ii','KK')

In [1]: 
# dataframe 2 
convert_table = {'X': ['dd','ee','ff','gg','hh','ll','mm','nn','oo','pp','qq','rr','ss','tt','uu'], 
       'Y': ['DD','VV','FF','GG','HH','LL','MM','NN','JJ','PP','XX','BB','SS','NN','LL'], 
       'Z': [5,7,11,13,17,19,23,29,37,41,43,47,53,59,61]} 
df2 = pd.DataFrame(convert_table) 



In [2]: merged = df1.merge(df2, left_on=['B','C'], right_on=['X','Y'], how='left') 
     merged 
Out[2]: 
    A B C X Y  Z 
0 90 qq XX qq XX 43.0 
1 20 ee VV ee VV 7.0 
2 30 rr BB rr BB 47.0 
3 25 tt NN tt NN 59.0 
4 50 ii KK NaN NaN NaN 
5 60 oo JJ oo JJ 37.0 

Теперь, чтобы получить окончательный dataframe:

In [3]: 
merged.ix[merged.Z.notnull(),'B'] = merged.ix[merged.Z.notnull(),'Z'] 
merged = merged[['A','B','C']] 
merged 

Out[3]: 
    A B C 
0 90 43 XX 
1 20 7 VV 
2 30 47 BB 
3 25 59 NN 
4 50 ii KK 
5 60 37 JJ 
+0

Можно ли получить вывод с тем же числом столбцов, что и тот, который я получил в моем примере? –

+1

Я только что сделал это, в то же время вы отправили свой комментарий :) –

+0

Спасибо большое :) –

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