- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个练习 pandas 和 Beautiful soup 的个人项目,我抓取了这些信息并将它放在 pandas df 中,如下所示:
0 €8.5M
1 €0
2 €9.5M
3 €2M
4 €21M
...
16534 €1.8M
16535 €1.1M
16536 €550K
16537 €650K
16538 €1.1M
Name: Value, Length: 16539, dtype: object
0 €67K
1 €0
2 €15K
3 €11K
4 €13K
...
16534 €3K
16535 €2K
16536 €2K
16537 €7K
16538 €3K
Name: Wage, Length: 16539, dtype: object
因此,为了分析这些信息,我想清理这些数据并将其转换为整数,我能想到的是:
df['Wage'] = df['Wage'].apply(lambda x: re.sub('€','',x))
df['Wage'] = df['Wage'].apply(lambda x: re.sub('K','000',x))
df['Value'] = df['Value'].apply(lambda x: re.sub('€','',x))
df['Value'] = df['Value'].apply(lambda x : re.sub('M','00000',x) if (('M' in x) and ('.' in x))else x)
df['Value'] = df['Value'].apply(lambda x : re.sub('[.]','',x))
df['Value'] = df['Value'].apply(lambda x : re.sub('M','000000',x))
df['Value'] = df['Value'].apply(lambda x : re.sub('K','000',x))
df['Wage'] = df['Wage'].astype(int)
df['Value'] = df['Value'].astype(int)
我首先替换了货币符号,然后检查点,这样我就可以将 M 替换为 5 个零,然后将剩余的 M 替换为 6 个零,然后将 K 替换为 3 个零,然后我将类型更改为 int。但我觉得这不是一个好方法,你怎么看?这样做的更好方法是什么?我尝试创建一个函数,但无法创建。
最佳答案
新解决方案:使用 .replace()
和 astype()
只有。
不依赖pd.eval
对于公式评估:
您可以将 M
、K
转换为指数格式的相应量级:
K
转换为科学计数法的e+03
M
转换为科学计数法的e+06
(支持整数
以及任意小数位的 float
)
然后将科学计数法的文本转为float类型,再转换为整型,得到最终需要的格式,如下:
df['Value'] = df['Value'].replace({'€': '', ' ': '', 'M': 'e+06', 'K': 'e+03'}, regex=True).astype(float).astype(int)
输入数据:
Value
0 €8.5M
1 €0
2 €9.5M
3 €2M
4 €21M
16534 €1.8M
16535 €1.1M
16536 €550K
16537 €650K
16538 €1.1M
输出:
print(df)
Value
0 8500000
1 0
2 9500000
3 2000000
4 21000000
16534 1800000
16535 1100000
16536 550000
16537 650000
16538 1100000
您可以将M
、K
转换为公式,然后使用pd.eval
评估数值。
K
转换为公式 * 1000
M
转换为公式 * 1000000
通过这种方式,我们可以支持带有任意数量小数点的基值(带或不带小数点以及小数部分可以有多长)。对于小数点后所有长度的小数部分,我们可以从公式中得到正确的结果。
df['Value'] = df['Value'].str.replace('€', '')
df['Value'] = df['Value'].str.replace('M', ' * 1000000')
df['Value'] = df['Value'].str.replace('K', ' * 1000')
df['Value'] = df['Value'].map(pd.eval).astype(int)
或者在一行中简化代码,感谢@MustafaAydın 的建议:
df['Value'] = df['Value'].replace({"€": "", "M": "*1E6", "K": "*1E3"}, regex=True).map(pd.eval).astype(int)
结果:
print(df)
Value
0 8500000
1 0
2 9500000
3 2000000
4 21000000
16534 1800000
16535 1100000
16536 550000
16537 650000
16538 1100000
输入样本数据如下:
Value
0 €8.5M
1 €0
2 €9.5M
3 €2M
4 €21M
16534 €1.8M
16535 €1.1M
16536 €550K
16537 €650K
16538 €1.1M
在最后一步之前,我们得到:
Value
0 8.5 * 1000000
1 0
2 9.5 * 1000000
3 2 * 1000000
4 21 * 1000000
16534 1.8 * 1000000
16535 1.1 * 1000000
16536 550 * 1000
16537 650 * 1000
16538 1.1 * 1000000
然后我们将它提供给 pd.eval
以供其评估并转换为数值( float ),我们可以进一步将其转换为整数。
关于Python Pandas df,将货币金额中的 $、M 和 K 替换为 int 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67891653/
条件: 我们需要我们 Magento 网站的默认显示货币是美元,Paypal(基础货币)也需要是美元(因为我们需要客户以美元支付)。 我们的 Fedex a/c 是在新加坡开设的,结果发现运费是以新加
根据 currency_str 和 created_date_time 合并两个数据帧(xrate 和 df)时遇到问题 display(xrate.info()) Int64Index: 1611
我必须匹配像 这样的值 € 6.483,00 或类似的值 18,50% 或者,再次, +65,86 % 在我起草的 Javascript 函数中: function(s) { return /^
我正在尝试将货币金额解析并存储为 BigDecimal 值。我得到了相关货币的区域设置,在大多数情况下它工作正常,但当货币是哥斯达黎加科朗时我得到了意想不到的结果。 我的哥斯达黎加客户告诉我,典型的货
在当前版本的 Excel(Office 365/2019 年 2 月)中获得近似每日外汇汇率的最简单的免费方法是什么。 我对历史数据不感兴趣,我只想要从货币 X 到货币 Y 的最后已知日汇率,并且只在
我在 spree 时遇到了麻烦,不知道如何处理。 我无法更改主要货币。 我该怎么做? 最佳答案 它在 Spree 2.0.0 中更容易,而且显然它也可以在以前的 spree 版本中工作。 转到您的 c
在我的网络应用程序中,我有一个名为“预算”的输入字段,用户可以在其中输入项目的建议预算。我需要创建一个屏蔽输入,以便在用户在输入字段中输入时自动将输入的金额转换为以下格式: 1000 10 000 1
我正在从数据库返回一个字符串,但由于数据库的编码方式,一些英镑符号 (£) 被问号取代。我想恢复井号,但不替换字符串中真正的问号。我已经设法编写了一个正则表达式来测试问号后跟数字的组合,但我不确定如何
我在使用亚马逊销售 API 时遇到问题。我在 amazon.co.uk 有一个帐户,可以正常发送产品。我在 amazon.de 有一个新帐户,除了货币外,一切都很好。 我有一个零售价为 10 英镑 (
Pharo 有什么方法可以将数字转换为单词。 例如:1200 = 一千二百而已。 实现起来并不难,只是想知道。 最佳答案 Integer>>asWords会这样做。 1200 asWords返回 'o
我有一个简单的单页网络应用程序。它从两个不同的 API 获取货币数据(以美元为单位),在成功检索后,promise 被解决,一些计算得出 GBP/Bitcoin 汇率。 我正试图找到一种干净的方法,然
我有以下简单的计算,它将两个值加在一起。这些值与使用“R”作为前缀标识的兰特(南非货币)有关。 function calculate() { var A = parseFloat(docume
使用 JavaScript,什么是将点替换为逗号的正确方法(对于欧盟货币),例如: 2000.65 将是 2000,65 而不是 2,000.65 39.20 将是 39,20 我不确定 cost.r
我在文本框中显示带有 NumberFormat 的货币符号 NumberFormat numberFormat = NumberFormat.getSimpleCurrencyFo
我已经设法从非接触式阅读器读取了一个交易事件,使用 现在我的 Activity 打开了,我被困在那个点上,因为我认为我的 Intent 中会有一些数据,比如 amou
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
这个问题在这里已经有了答案: Why not use Double or Float to represent currency? (16 个答案) 关闭 3 年前。 我的应用程序中的一些计算有问题
我使用 Jruby(反正就是 ruby,在 jvm 下运行 :D )和马拉松测试(一个 java swing 应用程序),我在处理货币数字时遇到了一些麻烦。 我不使用 Rails(不知道我是否可以
我正在尝试删除 、 或 之后的尾随零。 以一种货币表示,仍然保留货币符号。例如,€90.00 到 €90、90.00€ 到 90€ 和 €90.33 到 €90.33。 示例如下: $('.produ
我想将带小数点的数字(以货币计)转换成单词 例如:12345.60--> 一万二千三百四十五美元六十美分 我从 http://www.csharp-tutorials.info/2016/04/con
我是一名优秀的程序员,十分优秀!