如何在不使用 python 循环的情况下检测和转换列值的单位?
Posted
技术标签:
【中文标题】如何在不使用 python 循环的情况下检测和转换列值的单位?【英文标题】:How to detect and convert units of column values without using python loop? 【发布时间】:2020-04-13 16:55:23 【问题描述】:据我所知,Python 循环很慢,因此最好使用 pandas 内置函数。
在我的问题中,一列会有不同的货币,我需要将它们转换为美元。如何使用 pandas 内置函数检测它们并将其转换为美元?
我的专栏如下:
100Dollar
200Dollar
100Euro
300Euro
184pounds
150pounds
10rupee
30rupee
注意:金额和货币名称在同一列。
注意:兑换汇率 w.r.t 美元欧元:1.2,英镑:1.3,卢比:0.05
注意:货币枚举为 ['Euro', 'Dollar', 'Pounds', 'Rupee']
【问题讨论】:
我们需要一个转换/汇率才能做到这一点。 要么你需要有标准的货币术语:EUR
、INR
、USD
等等,否则你必须给我们一些映射来做到这一点
【参考方案1】:
将Series.str.extract
与正则表达式一起使用,将正确的值添加到新列中。然后将exchange_rate
映射到Currency
列,计算Amount dollars
:
df[['Amount', 'Currency']] = df['column'].str.extract(r'(\d+)(\D+)')
exchange_rate = 'Euro': 1.2, 'pounds': 1.3, 'rupee': 0.05
df['Amount_dollar'] = pd.to_numeric(df['Amount']) * df['Currency'].map(exchange_rate).fillna(1)
column Amount Currency Amount_dollar
0 100Dollar 100 Dollar 100.00
1 200Dollar 200 Dollar 200.00
2 100Euro 100 Euro 120.00
3 300Euro 300 Euro 360.00
4 184pounds 184 pounds 239.20
5 150pounds 150 pounds 195.00
6 10rupee 10 rupee 0.50
7 30rupee 30 rupee 1.50
【讨论】:
我明白你的意思,但我认为 OP 只是举了一个汇率的例子。通常,当您拥有财务数据时,数据库中的某处会存储一个“汇率表”,其中存储了所有货币的每日汇率。至少这是我的经验。我看到了您提供的软件包,这很好,但是在处理财务数据时,很难让监管机构相信您使用了开源软件包进行货币转换。虽然这些包在大多数情况下更准确。【参考方案2】:我会建议使用CurrencyConverter
包(用谷歌测试的准确性)类似于以下内容:
from currency_converter import CurrencyConverter
c = CurrencyConverter()
d='Dollar':'USD','Euro':'EUR','pounds':'GBP','rupee':'INR' #mapping dict
m=pd.DataFrame(df['column'].replace(d,regex=True).str.findall(r'(\d+|\D+)').tolist())
new_df=df.assign(USD_VALUE=[c.convert(a,b,'USD') for a,b in zip(m[0],m[1])])
column USD_VALUE
0 100Dollar 100.000000
1 200Dollar 200.000000
2 100Euro 110.770000
3 300Euro 332.310000
4 184pounds 242.428366
5 150pounds 197.631820
6 10rupee 0.140999
7 30rupee 0.422996
【讨论】:
从来不知道这个包。谢谢,很好的实现。 +1以上是关于如何在不使用 python 循环的情况下检测和转换列值的单位?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比
如何在不使用collect()和for循环的情况下将一个(IP地址)的特定部分与RDD python pyspark中另一列中的其他IP地址进行比较