новый столбец pandas равен другому столбцу с условием

#python #database #pandas #numpy #dataframe

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

Вопрос:

получена база данных pd под названием data:

                  transaction_id  house_id    date_sale  sale_price boolean_2015
0                     1         1  31 Mar 2016    £880,000         True
3                     4         2  31 Mar 2016    £450,000         True
4                     5         3  31 Mar 2016    £680,000         True
6                     7         4  31 Mar 2016  £1,850,000         True
7                     8         5  31 Mar 2016    £420,000         True
  

и еще один называется houses:

     id                                                  address  postcode       postcode first
0          1  Flat 78, Andrewes House, Barbican, London, Gre...  EC2Y 8AY       EC2Y  
1          2  Flat 35, John Trundle Court, Barbican, London,...  EC2Y 8DJ       EC2Y
  

и вопрос в том, как мне добавить столбец к данным с именем ‘postcode_first’, где я ищу данные [‘house_id’] и добавляю первую часть почтового индекса к каждой строке в data[‘postcode_first’]?
ближайший, который я получил, был

 data['postcode'] = np.where(houses['id'] == data['house_id'])
  

но это вообще не имеет смысла
есть кто-нибудь, кто может помочь?
РЕДАКТИРОВАТЬ
также пробовал
data['postcode'] = houses.loc[houses['id'] == data['house_id']]['postcode_first']

но это вернуло

     Traceback (most recent call last):
  File "/Users/saminahbab/Documents/House_Prices/final project/sql_functions.py", line 30, in <module>
    data['postcode'] = houses.loc[houses['id'] == data['house_id']]['postcode_first']
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/core/ops.py", line 735, in wrapper
    raise ValueError('Series lengths must match to compare')
ValueError: Series lengths must match to compare
  

что не должно иметь значения, потому что я пытаюсь по существу сказать data['postcode'] equals houses['postcode_first'] WHERE houses['id'] equals data['house_id']

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

1. Можете ли вы опубликовать желаемый результат для data['postcode'] столбца?

2. данные [‘почтовый индекс’] должны быть EC2Y для обеих строк, которые можно найти в houses[‘postcode_first’]. дома[‘house_id’] соответствуют значениям в домах [‘id’]

Ответ №1:

Вы можете использовать метод map():

 In [108]: df['postcode'] = df.house_id.map(h.set_index('id')['postcode first'])

In [109]: df
Out[109]:
   transaction_id  house_id    date_sale  sale_price boolean_2015 postcode
0               1         1  31 Mar 2016    £880,000         True     EC2Y
3               4         2  31 Mar 2016    £450,000         True     EC2Y
4               5         3  31 Mar 2016    £680,000         True      NaN
6               7         4  31 Mar 2016  £1,850,000         True      NaN
7               8         5  31 Mar 2016    £420,000         True      NaN
  

Данные:

 In [110]: h
Out[110]:
   id                                         address  postcode postcode first
0   1  Flat 78, Andrewes House, Barbican, London, Gre  EC2Y 8AY           EC2Y
1   2   Flat 35, John Trundle Court, Barbican, London  EC2Y 8DJ           EC2Y

In [113]: df
Out[113]:
   transaction_id  house_id    date_sale  sale_price boolean_2015
0               1         1  31 Mar 2016    £880,000         True
3               4         2  31 Mar 2016    £450,000         True
4               5         3  31 Mar 2016    £680,000         True
6               7         4  31 Mar 2016  £1,850,000         True
7               8         5  31 Mar 2016    £420,000         True