如何在不使用 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']

【问题讨论】:

我们需要一个转换/汇率才能做到这一点。 要么你需要有标准的货币术语:EURINRUSD 等等,否则你必须给我们一些映射来做到这一点 【参考方案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地址进行比较

FastJson 在不关闭循环引用检测的情况下,替换或者消除$ref

如何在不阻塞事件循环的情况下迭代大型列表

如何在不使用“除外”python的情况下退出不和谐机器人

我正在使用熊猫数据框,我需要在不使用循环的情况下将一整列纪元时间戳转换为人类时间