У меня есть фрейм данных, в котором значения одного столбца представляют собой списки строк. здесь структура файла для чтения:
[
{
"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":[]
Это не работает со значением в массиве
Это работает. Я проверил это.
Пожалуйста, измените вопрос, чтобы поместить образец проблемного ввода, то есть ваш пустой список. Люди должны иметь возможность вырезать и вставлять ваш образец и воспроизводить реальную проблему, с которой вы боретесь.
Это недействительный json после изменения описания
Если я правильно понимаю:
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!.
Не могли бы вы указать, как вы читаете файл JSON в вопросе? Я думаю, что мы читаем это по-разному, поэтому ошибка и ваш конец, а не мой :)
df = pd.read_json("filename.json")
Когда я вставляю ваш JSON в filename.json
, запускаю df = pd.read_json("filename.json")
, а затем df = df.apply(lambda col: col.str.strip().str.replace(r'\s+', ' ', regex=True))
, он создает фрейм данных, такой же, как тот, что в моем ответе. Так что не могу сказать что не так...
Я думаю, потому что у меня есть какое-то значение, которое пусто в некоторых строках, например "key3":[]
Если я правильно понимаю, некоторые из ваших ячеек данных имеют значения 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 []
У меня есть массив объектов, так что это не сработает
Я обновил код до нового формата входных данных
Используйте
df.replace('\s+', ' ', regex=True)
для нескольких пробелов и используйтеstr.strip
для начальных и конечных пробелов.