python-3.x - 根据其他 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 等
解决方案
用于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
推荐阅读
- javascript - 使用数组查询数据库的更好方法
- angularjs - 将 keydown 事件定位到 angularJS 自定义指令
- neo4j - Neo4j-graphql-js -- 有没有办法检查可选参数是否存在或不为空?
- c++ - 文件 I/O 分配
- java - 我运行像 for(String Day : days) 这样的 for 循环,我想在 for 循环之外打印 for 循环的数据怎么做?
- mysql - MySQL - 查询不同数据库/主机名上的表
- batch-file - 使用批处理文件从不同目录复制多个具有相同命名格式的文件
- mysql - mysql - 选择所有操作(收入和支出)并在之后声明
- python - 从熊猫使用 loc 时出现 KeyError
- ios - SVProgressHUD 在关闭后运行特定状态/错误消息的代码