gpt4 book ai didi

Python Pandas df,将货币金额中的 $、M 和 K 替换为 int 的最佳方法

转载 作者:行者123 更新时间:2023-12-04 00:49:05 25 4
gpt4 key购买 nike

我正在做一个练习 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对于公式评估:

您可以将 MK 转换为指数格式的相应量级:

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

旧解决方案:

您可以将MK转换为公式,然后使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com