Удаление строк из столбца Pandas DataFrame

1

У меня есть рамка данных pandas, как показано ниже.

DF1 =

sid                 path
 1    '["rome","is","in","province","lazio"]'   
 1    "['rome', 'is', 'in', 'province', 'naples']"
 1     ['N']
 1    "['rome', 'is', 'in', 'province', 'in', 'campania']"
 ....

Я хочу удалить все ненужные символы path столбца, чтобы результат выглядел так:

DF2 =

    sid                  path
     1         rome is in province lazio
     1         rome is in province naples
     1                    N
     1         rome is in province in campania
 ....

Я попытался заменить все ненужные символы следующим образом:

 DF1["path"].replace("[","").replace("]","").replace('"',"").replace(","," ").replace("'","")

Но это не сработало. Я полагаю, что это связано с записями ["N"]

Как я могу это сделать? Любая помощь приветствуется!

Теги:
pandas
dataframe

2 ответа

1
Лучший ответ

Использование ast.literal_eval & str.join

Демо - версия:

import pandas as pd
import ast
df = pd.DataFrame({"path": ['["rome","is","in","province","lazio"]', "['rome', 'is', 'in', 'province', 'naples']", ['N']]})
df['path'] = df['path'].astype(str).apply(ast.literal_eval).apply(lambda x: " ".join(x))
print(df)

Выход:

                         path
0   rome is in province lazio
1  rome is in province naples
2                           N
  • 0
    Похоже, использование astype(str) должно помочь ......
  • 0
    Да, это может сработать, хотя и немного окольным путем, так как вы применяете list -> str -> list .
1

Вы можете использовать ast.literal_eval для безопасного вывода списков в виде строк. Один из способов учета подлинности списков состоит в том, чтобы поймать ValueError.

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

from ast import literal_eval

df = pd.DataFrame({'sid': [1, 1, 1, 1],
                   'path': ['["rome","is","in","province","lazio"]',
                            "['rome', 'is', 'in', 'province', 'naples']",
                            ['N'],
                            "['rome', 'is', 'in', 'province', 'in', 'campania']"]})

def converter(x):
    try:
        return ' '.join(literal_eval(x))
    except ValueError:
        return ' '.join(x)

df['path'] = df['path'].apply(converter)

print(df)

                              path  sid
0        rome is in province lazio    1
1       rome is in province naples    1
2                                N    1
3  rome is in province in campania    1
  • 1
    Есть ли разница между ast.literal_eval и plain eval ?
  • 3
    @BubbleBubbleBubbleGut, да, eval небезопасен и не рекомендуется.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню