python - 熊猫数据框根据另一个字段的条件更改值
问题描述
我有一个带有 4 列的熊猫数据框res:帐户、货币、余额 LCY、余额 FCY
我还有一个包含所有不同货币汇率的字典汇率(关键货币名称:价值汇率作为字符串)我需要将货币不是欧元的账户上的 Balance LCY 更改为Balance FCY / rate。
我试图运行:
res['Balance LCY'].loc[res['Currency'] != 'EUR'] = res['Balance FCY'] / float(rates[res['Currency']])
但是我得到一个错误:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
任何帮助表示赞赏。
似乎问题是在货币列中提取特定单元格的值,以在外部字典中执行查找。
我设法自己解决了这个问题,方法是将字典转换为数据框,将其与原始 res 数据框连接,然后执行计算。
解决方案代码:
erates = pd.DataFrame(list(rates.items()), columns=['Currency', 'Rate'])
res = pd.merge(res, erates, how='left', on='Currency')
res.loc[res['Currency'] != 'EUR', 'Balance LCY'] = res['Balance FCY'] / res['Rate']
样本数据资源:
Account,Currency,Balance LCY,Balance FCY
123,EUR,-299183.94,0
124,EUR,-28578532,0
125,EUR,0,0
126,CAD,0,0
127,PLN,0,-2646970
128,ZAR,0,-5026915
129,DKK,0,-2862948.8
130,CHF,0,-343557.9
131,USD,0,-71672.87
132,CAD,0,84295.63
133,SGD,0,-269976.9
134,TRY,0,-494451.56
135,NZD,0,-256601.95
136,JPY,0,0
费率:
rates= {
"CAD": 1.432,
"HKD": 8.4117,
"ISK": 138.3,
"PHP": 54.955,
"DKK": 7.4702,
"HUF": 337.1,
"CZK": 25.061,
"AUD": 1.6363,
"RON": 4.804,
"SEK": 10.569,
"IDR": 14867.58,
"INR": 77.754,
"BRL": 4.755,
"RUB": 69.548,
"HRK": 7.449,
"JPY": 120.96,
"THB": 34.164,
"CHF": 1.061,
"SGD": 1.5131,
"PLN": 4.2835,
"BGN": 1.9558,
"TRY": 6.6131,
"CNY": 7.5945,
"NOK": 10.0873,
"NZD": 1.7104,
"ZAR": 16.2965,
"USD": 1.0801,
"MXN": 20.5183,
"ILS": 3.6985,
"GBP": 0.8351,
"KRW": 1309.45,
"MYR": 4.5294
}
解决方案
有一个简单的设计解决方案 - 您应该始终将您的基础货币添加到您的字典中,其中 FX rate 等于 1。
在你的情况下:
rates["EUR"]=1
erates = pd.DataFrame(list(rates.items()), columns=['Currency', 'Rate'])
res = pd.merge(res, erates, how='left', on='Currency')
res["Balance LCY"]=res["Balance FCY"].div(res["Rate"])
输出:
Account Currency Balance LCY Balance FCY Rate
0 123 EUR 0.000000 0.00 1.0000
1 124 EUR 0.000000 0.00 1.0000
2 125 EUR 0.000000 0.00 1.0000
3 126 CAD 0.000000 0.00 1.4320
4 127 PLN -617945.605229 -2646970.00 4.2835
5 128 ZAR -308465.928267 -5026915.00 16.2965
6 129 DKK -383249.283821 -2862948.80 7.4702
7 130 CHF -323805.749293 -343557.90 1.0610
8 131 USD -66357.624294 -71672.87 1.0801
9 132 CAD 58865.663408 84295.63 1.4320
10 133 SGD -178426.343269 -269976.90 1.5131
11 134 TRY -74768.498889 -494451.56 6.6131
12 135 NZD -150024.526427 -256601.95 1.7104
13 136 JPY 0.000000 0.00 120.9600
推荐阅读
- ajax - 如何在 YII2 中将自己的数据添加到 POST 中?
- reactjs - 我不明白为什么在我的 Mern 堆栈中创建路由时,我会在 JSX 的早期属性上出现错误
- mysql - 尝试从 mysql 命令行获取文件时收到语法错误
- ruby-on-rails - Button_to 补丁方法意外工作
- powerbi - 卡住将公式添加到动态添加的列
- php - Json php将数组链接url插入到mysql
- reactjs - 我可以在不触发重新渲染的情况下更新 redux 存储中的属性吗?
- apache-kafka - Kafka、消费者偏移量和多个异步提交
- java - 在 Spring Data JPA 中使用 DB2 的 UR 选项
- alexa - 如何创建一个 Alexa 应用程序来获取用户当前位置并告诉他我最近的办公室?