В серии со смешанными типами данных, как преобразовать случайные списки и dicts в строки?

#json #python-3.x #pandas

#json #python-3.x #pandas

Вопрос:

Я пытаюсь очистить файл json со всеми моими собственными сообщениями Telegram из определенного чата, где я получаю уведомления от бота. Хотя сообщения в приложении довольно чистые, в файле json они становятся немного запутанными. Например, приведенное ниже однострочное сообщение Telegram…

 Xparty P-Q D-21-01-30-20-12 (USDT_UNI): deal_284174394: Base order executed. 
Price: 21.03739122 USDT. Size: 127.06584296 USDT (6.04 UNI)
 

в файле json становится:

 ['Xparty P-Q D-', {'type': 'phone', 'text': '21-01-30-20-12'}, ' (USDT_UNI): deal_284174394: 
Base order executed. Price: 21.03739122 USDT.  Size: 127.06584296 USDT (6.04 UNI)'] 
 

Итак, я пытаюсь очистить сообщения в файле json, чтобы иметь возможность работать с ними. Поскольку весь этот шум следует определенным шаблонам, я пытаюсь добавить шаблоны в список, а затем заменить их следующим образом:

 noise = [", {'type': 'phone', 'text': ", ", {'type': 'hashtag', 'text': ", "[", "]", "}, "]
df["messages"].str.replace('|'.join(noise), '', regex=False)
 

Но моя первая проблема заключается в том, что на самом деле часть этого шума возникает из-за того, что НЕКОТОРЫЕ из таких сообщений записываются в виде СПИСКОВ, другие — в виде диктовок, и только некоторые из них являются строками. Поэтому я считаю, что сначала я должен преобразовать все в строки.

Я надеялся, что a просто df['messages'].apply(' '.join) сделает свое дело, но поскольку не все записи являются СПИСКАМИ, это не работает.

Итак, мой вопрос: как я могу преобразовать все списки и Dicts из определенной серии в строки, учитывая, что в серии есть разные типы данных? (надеюсь, без необходимости возвращаться к циклам!)

Комментарии:

1. df['messages'] Содержит ли данные json в необработанном виде ['Xparty P-Q D-', {'type': 'phone', 'text': '21-01-30-20-12'}, ' (USDT_UNI): deal_284174394: Base order executed. Price: 21.03739122 USDT. Size: 127.06584296 USDT (6.04 UNI)'] ?

2. Иногда да, иногда это просто строка, например `GridBot (USDT_XRP): bot_32000: бот включен`.

Ответ №1:

Это должно сработать:

 import json
df['messages'] = df['messages'].apply(lambda x: json.dumps(x))