Просто (несколько) быстрый вопрос - если у меня есть фрейм данных со столбцом, состоящим из чисел формы 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'}]
Кажется, я не могу найти никаких ссылок на это, и некоторые идеи будут глубоко оценены. Спасибо!
@PatrickArtner Подождите, я добавлю дополнительную информацию, которую я случайно пропустил.
@PatrickArtner Я добавил это! Извините за путаницу, надеюсь, это поможет.
Поделитесь, пожалуйста, csv - нескольких строк должно хватить. Как предположение: 1.305.000 будет 1,305 миллиона, а не 1305. 443.111.34000 недействителен, как бы вы его ни поворачивали. Если только это не какое-то индийское обозначение en.wikipedia.org/wiki/Индийская_система_нумерации, где они иногда пропускают некоторые цифры ... не могу найти ссылку прямо сейчас
@PatrickArtner Спасибо за то, что поделились и предложили. Я думаю, что разделители здесь будут ., и я также добавил изображение того, как выглядит csv выше
@Stoner, вместо изображения, которое вы разместили в верхней части файла CSV в блоке кода, было бы лучше - таким образом, люди могут копировать / вставлять его для создания своего собственного фрейма данных - было бы еще лучше, если бы вы могли опубликовать результат your_df.head(10).to_dict(orient='records') тогда люди смогут напрямую использовать это в своих REPL для воссоздания вашего DF.
@JonClementsСпасибо за ваш отзыв. Я внесла правки и надеюсь, что теперь стало лучше.. Прошу прощения за это!






Я бы определил функцию для анализа числа, а затем использовал бы 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 используется таким образом?
Это не совсем вопрос панд, он действительно спрашивает о превращении странных строк в числа (тег: форматирование чисел).
Следующая функция превратит эти строки в нужные числа:
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.305.000недопустимый номер. Это может быть допустимым строковым представлением, если вы измените его на1,305.000(США) или1.305,000(Германия).