(Python)如何修复数据框列值中的数值表示错误
Posted
技术标签:
【中文标题】(Python)如何修复数据框列值中的数值表示错误【英文标题】:(Python) How to fix numerical representation error in dataframe column values 【发布时间】:2019-03-23 14:11:00 【问题描述】:只是一个(有点)快速的问题 - 如果我有一个数据框,其中有一列由 1.305.000, 4.65, 99.9, 443.111.34000
形式的数字组成,我如何将它们转换为“正确”格式:1305.000, 4.65, 99.9, 443111.34000
?
如果有帮助,这些值是从 .csv
文件的其中一列中获得的,例如“总净收入”:
代码块形式:
Day Service Total Net Revenue
0 1 te 1.305.000
1 1 as 4.65
2 2 qw 99.9
3 3 al 443.111.34000
4 6 al 443.111.34000
5 6 te 1.305.000
6 7 pp 200
7 7 te 1.305.000
8 7 al 443.111.34000
9 7 te 1.305.000
还有一种基于反馈的形式:
['Day': 1, 'Service': 'te', 'Total Net Revenue': '1.305.000',
'Day': 1, 'Service': 'as', 'Total Net Revenue': '4.65',
'Day': 2, 'Service': 'qw', 'Total Net Revenue': '99.9',
'Day': 3, 'Service': 'al', 'Total Net Revenue': '443.111.34000',
'Day': 6, 'Service': 'al', 'Total Net Revenue': '443.111.34000',
'Day': 6, 'Service': 'te', 'Total Net Revenue': '1.305.000',
'Day': 7, 'Service': 'pp', 'Total Net Revenue': '200',
'Day': 7, 'Service': 'te', 'Total Net Revenue': '1.305.000',
'Day': 7, 'Service': 'al', 'Total Net Revenue': '443.111.34000',
'Day': 7, 'Service': 'te', 'Total Net Revenue': '1.305.000']
我似乎找不到任何关于此的参考,我们将不胜感激。谢谢!
【问题讨论】:
那些是字符串?1.305.000
不是有效数字。如果将其更改为 1,305.000
(美国)或 1.305,000
(德国),它可能是有效的字符串表示形式
@PatrickArtner 等一下,我会补充一些我不小心漏掉的信息。
@PatrickArtner 我已经添加了!很抱歉给您带来了困惑,希望对您有所帮助。
请分享 csv - 几行就足够了。作为猜测:1.305.000
将是 130.5 万 - 而不是 1305。443.111.34000
是无效的,但是你转动它。除非它的一些印度符号 en.wikipedia.org/wiki/Indian_numbering_system 他们有时会遗漏一些数字......现在找不到参考
@Stoner 最好不要将 CSV 文件顶部的图像发布到代码块中 - 这样,人们可以复制/粘贴它来创建自己的数据框 - 更好的是如果您可以发布 your_df.head(10).to_dict(orient='records')
的结果,那么人们可以直接在他们的 REPL 中使用它来重新创建您的 DF。
【参考方案1】:
这不是一个熊猫问题,它实际上是在询问如何将看起来很奇怪的字符串转换为数字(标签:数字格式)。
以下函数会将这些字符串转换为所需的数字:
import unittest
def cleanup(s: str) -> float:
parts = s.split('.')
if len(parts) > 1:
s = ''.join(parts[:-1]) + '.' + parts[-1]
return float(s)
class TestCleanup(unittest.TestCase):
def test_cleanup(self):
self.assertEqual(200, cleanup('200'))
self.assertEqual(4.65, cleanup('4.65'))
self.assertEqual(1305, cleanup('1.305.000'))
self.assertEqual(443111.34, cleanup('443.111.34000'))
如果这些是货币数字,您可以考虑使用Decimal
,这会激发“缩放整数”方法。
.apply()
cleanup()
函数对现有数据框很简单:
df['numeric_revenue'] = df['total_net_revenue'].apply(cleanup)
【讨论】:
感谢您的反馈以及测试用例!我会接受你的输入作为答案,尽管这两个答案在技术上是一样的。 :)【参考方案2】:我会定义一个函数来解析数字,然后在数据框的列上使用apply
。例如
def parse_number(number):
split_number = number.split(".")
return number if len(split_number) <= 1 else ".".join(["".join(split_number[:-1]), split_number[-1]])
df["parsed_value"] = df.value.apply(parse_number)
【讨论】:
感谢您的建议!但是,当我运行df["parsed_value"] = df.value.apply(parse_number)
时,它不起作用,我必须改为执行df["parsed_value"] = df["parsed_value"].apply(parse_number)
。以这种方式使用.value
是否有特定原因?以上是关于(Python)如何修复数据框列值中的数值表示错误的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:如何将数据框列值设置为 X 轴标签