Удалить пробелы из списка строк с помощью pandas/python

У меня есть фрейм данных, в котором значения одного столбца представляют собой списки строк. здесь структура файла для чтения:

[
    {
        "key1":"value1 ",
        "key2":"2",
        "key3":["a","b  2 "," exp  white   space 210"],
    },
    {
        "key1":"value1 ",
        "key2":"2",
        "key3":[],
    },

]

Мне нужно удалить все пробелы для каждого элемента, если это более одного пробела. ожидаемый результат:

[
    {
        "key1":"value1",
        "key2":"2",
        "key3":["a","b2","exp white space 210"],
    },
    {
        "key1":"value1",
        "key2":"2",
        "key3":[],
    }
]

Примечание: У меня есть значение, которое пусто в некоторых строках, например "key3":[]

Используйте df.replace('\s+', ' ', regex=True) для нескольких пробелов и используйте str.strip для начальных и конечных пробелов.

It_is_Chris 18.03.2022 16:20

Это не работает со значением в массиве

Learner 18.03.2022 16:24

Это работает. Я проверил это.

It_is_Chris 18.03.2022 16:25

Пожалуйста, измените вопрос, чтобы поместить образец проблемного ввода, то есть ваш пустой список. Люди должны иметь возможность вырезать и вставлять ваш образец и воспроизводить реальную проблему, с которой вы боретесь.

joanis 18.03.2022 16:58

Это недействительный json после изменения описания

GreyMurav 18.03.2022 18:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понимаю:

df = pd.read_json('''{
    "key1":"value1 ",
    "key2":"value2",
    "key3":["a","b   "," exp  white   space "],
    "key2":" value2"
}''')

df = df.apply(lambda col: col.str.strip().str.replace(r'\s+', ' ', regex=True))

Выход:

>>> df
     key1    key2             key3
0  value1  value2                a
1  value1  value2                b
2  value1  value2  exp white space

>>> df.to_numpy()
array([['value1', 'value2', 'a'],
       ['value1', 'value2', 'b'],
       ['value1', 'value2', 'exp white space']], dtype=object)

Я получил эту ошибку AttributeError: Can only use .str accessor with string values!.

Learner 18.03.2022 16:32

Не могли бы вы указать, как вы читаете файл JSON в вопросе? Я думаю, что мы читаем это по-разному, поэтому ошибка и ваш конец, а не мой :)

richardec 18.03.2022 16:33
df = pd.read_json("filename.json")
Learner 18.03.2022 16:35

Когда я вставляю ваш JSON в filename.json, запускаю df = pd.read_json("filename.json"), а затем df = df.apply(lambda col: col.str.strip().str.replace(r'\s+', ' ', regex=True)), он создает фрейм данных, такой же, как тот, что в моем ответе. Так что не могу сказать что не так...

richardec 18.03.2022 16:37

Я думаю, потому что у меня есть какое-то значение, которое пусто в некоторых строках, например "key3":[]

Learner 18.03.2022 16:41
Ответ принят как подходящий

Если я правильно понимаю, некоторые из ваших ячеек данных имеют значения list type.

Содержание file_name.json ниже:

[
    {
        "key1": "value1 ",
        "key2": "2",
        "key3": ["a", "b  2 ", " exp  white   space 210"]
    }, 
    {
        "key1": "value1 ",
        "key2": "2",
        "key3": []
    }
]

Возможное решение в этом случае следующее:

import pandas as pd
import re

df = pd.read_json("file_name.json")


def cleanup_data(value):
    if value and type(value) is list:
        return [re.sub(r'\s+', ' ', x.strip()) for x in value]
    elif value and type(value) is str:
        return re.sub(r'\s+', ' ', value.strip())
    else:
        return value

# apply cleanup function to all cells in dataframe
df = df.applymap(cleanup_data)

df

Возвращает

     key1  key2                           key3
0  value1     2  [a, b 2, exp white space 210]
1  value1     2                             []

У меня есть массив объектов, так что это не сработает

Learner 18.03.2022 18:16

Я обновил код до нового формата входных данных

GreyMurav 18.03.2022 18:19

Другие вопросы по теме