Установите значение в столбце в DataFrame на основе значений в другом DataFrame / python / pandas / numpy - PullRequest
0 голосов
/ 26 января 2020

У меня есть две таблицы СТАРЫЙ со страной и ценами (цены для одной и той же страны разные, потому что в одной и той же стране есть разные продавцы)

<table><tbody><tr><th>Country</th><th>Old_Price</th></tr><tr><td>PL</td><td>30</td></tr><tr><td>CZ</td><td>43</td></tr><tr><td>NL</td><td>15</td></tr><tr><td>PL</td><td>86</td></tr><tr><td>PL</td><td>94</td></tr><tr><td>FR</td><td>60</td></tr><tr><td>ES</td><td>56</td></tr><tr><td>AT</td><td>57</td></tr><tr><td>MT</td><td>62</td></tr><tr><td>PT</td><td>63</td></tr><tr><td>SE</td><td>29</td></tr><tr><td>RO</td><td>86</td></tr><tr><td>AM</td><td>76</td></tr></tbody></table>

NEW Это таблица со всеми странами и новыми ценами.

<table><tbody><tr><th>Country</th><th>New_Price</th></tr><tr><td>AT</td><td>517</td></tr><tr><td>BE</td><td>987</td></tr><tr><td>BG</td><td>462</td></tr><tr><td>CY</td><td>278</td></tr><tr><td>CZ</td><td>217</td></tr><tr><td>DE</td><td>574</td></tr><tr><td>DK</td><td>999</td></tr><tr><td>EE</td><td>469</td></tr><tr><td>ES</td><td>209</td></tr><tr><td>FI</td><td>189</td></tr><tr><td>FR</td><td>876</td></tr><tr><td>GB</td><td>766</td></tr><tr><td>GR</td><td>309</td></tr><tr><td>HR</td><td>692</td></tr><tr><td>HU</td><td>814</td></tr><tr><td>IE</td><td>755</td></tr><tr><td>IT</td><td>630</td></tr><tr><td>LT</td><td>734</td></tr><tr><td>LU</td><td>552</td></tr><tr><td>LV</td><td>249</td></tr><tr><td>MT</td><td>329</td></tr><tr><td>NL</td><td>924</td></tr><tr><td>PO</td><td>184</td></tr><tr><td>PT</td><td>268</td></tr><tr><td>PL</td><td>300</td></tr></tbody></table>

Проблема Я хочу добавить в СТАРУЮ таблицу новый столбец ("UPDATED_PRICE") на основе цены, указанной в таблице NEW. Результат должен быть - тот же UPDATED_PRICE для той же страны. Если в списке в НОВОЙ таблице нет страны, старая цена должна быть назначена UPDATED_PRICE.

Решением может быть: лямбда, или / и функция, и / или np.where et c

Ответы [ 2 ]

0 голосов
/ 26 января 2020
JOIN = OLD.merge(NEW, on='Country', how='left', validate="many_to_many").ffill(axis=1)
print(JOIN)

   Country Old_Price New_Price
0       PL        30       300
1       CZ        43       217
2       NL        15       924
3       PL        86       300
4       PL        94       300
5       FR        60       876
6       ES        56       209
7       AT        57       517
8       MT        62       329
9       PT        63       268
10      SE        29        29
11      RO        86        86
12      AM        76        76
0 голосов
/ 26 января 2020

Используйте Series.map для сопоставления на Country и замените несоответствующие значения исходным столбцом на Series.fillna:

s = NEW.set_index('Country')['New_Price']
OLD['UPDATED_PRICE'] = OLD['Country'].map(s).fillna(OLD['Old_Price'])

Или вы можете используйте левое соединение с DataFrame.merge:

OLD = OLD.merge(NEW.rename(columns={'New_Price':'UPDATED_PRICE'}), 
                on='Country', how='left').fillna({'UPDATED_PRICE':OLD['Old_Price']})

print (OLD)
   Country  Old_Price  UPDATED_PRICE
0       PL         30          300.0
1       CZ         43          217.0
2       NL         15          924.0
3       PL         86          300.0
4       PL         94          300.0
5       FR         60          876.0
6       ES         56          209.0
7       AT         57          517.0
8       MT         62          329.0
9       PT         63          268.0
10      SE         29           29.0
11      RO         86           86.0
12      AM         76           76.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...