(Python) Как исправить ошибку числового представления в значениях столбца данных - PullRequest
1 голос
/ 23 марта 2019

Просто (несколько) быстрый вопрос - если у меня есть фрейм данных со столбцом, состоящим из чисел вида 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'}]

Кажется, я не могу найти какую-либо ссылку на это, и некоторое понимание будет высоко оценено.Спасибо!

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Это не совсем вопрос панды, он действительно спрашивает о превращении странных строк в числа (тег: форматирование чисел).

Следующая функция превратит эти строки в нужные числа:

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)
1 голос
/ 23 марта 2019

Я бы определил функцию для анализа числа, а затем использовал бы 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)
...