首页 > 解决方案 > 根据其他 DataFrame / python / pandas / numpy 中的值设置 DataFrame 中的列中的值

问题描述

我有两张带国家和价格的旧表(同一个国家的价格不同,因为在同一个国家有不同的供应商)

<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>

新 这是所有国家和新价格的表格。

<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>

问题我想根据 NEW 表中提供的价格向 OLD 表添加一个新列(“UPDATED_PRICE”)。结果应该是 - 同一个国家的相同 UPDATED_PRICE。如果新表中没有国家/地区,则应将旧价格分配给 UPDATED_PRICE。

解决方案可能是: lambda 或/和函数或/和 np.where 等

标签: python-3.xpandasnumpy

解决方案


用于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

推荐阅读