(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 轴标签

python, pyspark : 获取 pyspark 数据框列值的总和

熊猫如何通过数据框列值获取行索引

python用额外的列连接替换数据框列值

如何在循环中读取数据框列值并检查每列的数据类型