Разделить строковые значения столбца pandas .DataFrame на массив - PullRequest
1 голос
/ 08 января 2020

Я сделал sql запрос от postgresql и установил его как pandas .DataFrame (). Каждая строка выглядит следующим образом: «8B1LP1D», где буквы («B», «LP» и т. Д. c.) Являются разделителями. И этот подход:

#formula is a pd.DataFrame with 1 column
for x in formula:
    print(re.split('B|LP|D|E|OS|DN',x))

на выходе выглядит хорошо, как:

['8', '1', '1']
...
['5', '3', '2']
#etc

Но я должен добавить его в массив:

def move_parts(a):
    split = []
    for x in a:
        split.append(re.split('B|LP|D|E|OS|DN',x))
move_parts(formula)

и результат был возвращен как ошибка:

/usr/lib/python3.7/re.py in split(pattern, string, maxsplit, flags)
    211     and the remainder of the string is returned as the final element
    212     of the list."""
--> 213     return _compile(pattern, flags).split(string, maxsplit)
    214 
    215 def findall(pattern, string, flags=0):

TypeError: expected string or bytes-like object

что не так, как сохранить все разделенные значения в массив ?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Ошибка здесь не из-за добавления в список, а из-за значений re.split. Единственный способ, которым я смог воспроизвести ошибку, был, когда тип формулы = pandas .DataFrame. Когда я устанавливаю формулу в виде плоского списка или pandas .Series, все работает нормально. Возможно ли в вашем коде, что первая формула экземпляра была списком (или pandas .Series), а затем была заменена на pandas .DataFrame? Это может быть так же просто, как просто сослаться на фактическое имя столбца того, что вы хотите запустить в pandas .DataFrame. Давайте предположим, что он называется «request_results», затем мы изменим код на приведенный ниже, и он должен быть в состоянии выполнить:

def move_parts(a):
    split = []
    for x in a:
        split.append(re.split('B|LP|D|E|OS|DN',x))
move_parts(formula['request_results'].astype(str))

Примечание. Я также добавил в .astype (str) до конца. Другой альтернативой является то, что некоторые элементы в списке не относятся к типу str. Ошибка, которая создается, заключается в том, что второй параметр re.split () ожидает str (или байтовый объект, но не будет go в это), а вместо этого получает что-то другое - возможно, что-то вроде None или плавать.

1 голос
/ 08 января 2020

Если formula - это pd.DataFrame с 1 столбцом, как вы сказали, ваше первое выражение выдает ту же ошибку. Используйте pandas split вместо:

df = pd.DataFrame({'col1': ['8B1LP1','5E3DN2']})
df.iloc[:,0].str.split('B|LP|DN|E|OS|D',expand=True).values.tolist()

Вывод:

[['8', '1', '1'], ['5', '3', '2']]

PS: вы должны изменить порядок разделителей (как показано в моем примере ): более длинный'DN 'должен быть перед единичным' D ', иначе он никогда не будет совпадать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...