Как применить условия к str.split()

У меня есть фрейм данных, который содержит строку различной длины в каждой ячейке, т.е.

    Num
(1,2,3,4,5)
(6,7,8)
(9)
(10,11,12)

Я хочу избежать попыток выполнить str.split(',') для ячеек, в которых есть только одно число. Однако я хочу, чтобы все отдельные числа были преобразованы в список из одного элемента.

Вот что я пробовал, выдает ошибку, в которой говорится, что «объект 'int' не вызывается»

if (df['Num'].size() > 1):
    df['Num'] = df['Num'].str.split(',')

обновление для уточнения:

Index      Num
0          2,6,7
1      1,3,6,7,8
2      2,4,7,8,9
3     3,5,8,9,10
4         4,9,10
5          1,2,7
6      1,2,3,6,8
7      2,3,4,7,9
8     3,4,5,8,10
9          4,5,9
10           2,3
11           1,3
12           1,2
13         2,3,4
14         1,3,4
15         1,2,4
16         1,2,3
17             2
18             1

Я пытаюсь взять этот фрейм данных и преобразовать каждую строку Num из строки чисел в список. Я хочу, чтобы все индексы, содержащие только одно число (17 и 18), были преобразованы в список, содержащий один элемент (сам).

Этот код ниже работает только в том случае, если каждая строка состоит из более чем одного числа, разделенного знаком ','.

df['Adj'] = df['Adj'].str.split(',')

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

Index          Num
0            [2, 6, 7]
1      [1, 3, 6, 7, 8]
2      [2, 4, 7, 8, 9]
3     [3, 5, 8, 9, 10]
4           [4, 9, 10]
5            [1, 2, 7]
6      [1, 2, 3, 6, 8]
7      [2, 3, 4, 7, 9]
8     [3, 4, 5, 8, 10]
9            [4, 5, 9]
10              [2, 3]
11              [1, 3]
12              [1, 2]
13           [2, 3, 4]
14           [1, 3, 4]
15           [1, 2, 4]
16           [1, 2, 3]
17                 NaN
18                 NaN

Являются ли эти строки или кортежи, например. что вы видите для type(df['Num'].iat[0]) и type(df['Num'].iat[2])?

jpp 30.01.2019 18:28

str.split разбивает строку, используя заданный разделитель (pandas.pydata.org/pandas-docs/stable/reference/api/…). Тип каждой ячейки не является строкой, поэтому вы получаете эту ошибку!

Panos Antoniadis 30.01.2019 18:29

Я думаю, вы должны сделать df[ df['Num'].size > 1 ]['Num'].str.split(','). Но вопрос, который вы задаете, может быть шире. Вы должны написать правильный вопрос с минимальный воспроизводимый пример.

IMCoins 30.01.2019 18:29
df['Num'].size — это свойство, а не метод. df['Num'].size() - это место, где возникает ошибка.
r.ook 30.01.2019 18:32

Почему бы не просто df['Num'].str.split(',')? Вы хотели, чтобы (9) не был в list, как остальные в колонке? Не похоже, что разделение (9) вызовет какие-либо проблемы... оно просто не разделится. Также size не то, что вы думаете...

r.ook 30.01.2019 18:37

Извините, позвольте мне немного пояснить. Я хочу, чтобы отдельные числа были преобразованы в список из одного элемента, а все остальное — в список из нескольких элементов.

MaxB 30.01.2019 19:05

@jpp Я обновил вопрос, и да, это наверняка строки.

MaxB 30.01.2019 20:30
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что ваш столбец состоит из строк, и вам просто нужны отдельные числа как list из str, это должно помочь:

df['Num'].str.strip('()').str.split(',')

# 0    [1, 2, 3, 4, 5]
# 1          [6, 7, 8]
# 2                [9]
# 3       [10, 11, 12]
# Name: Num, dtype: object

Поскольку не все ваши данные относятся к типу str, вам нужно сначала преобразовать их в str, чтобы убедиться, что строковые методы вызываются правильно:

df['Num'].astype(str).str.split(',')

# 0            [2, 6, 7]
# 1      [1, 3, 6, 7, 8]
# 2      [2, 4, 7, 8, 9]
# ...
# 16           [1, 2, 3]
# 17                 [2]
# 18                 [1]

Я опубликовал обновление, чтобы лучше объяснить, к сожалению, ваш пример был не совсем тем, что я искал.

MaxB 30.01.2019 20:29

В своем редактировании вы сказали df['Adj'].str.split(',') работает только в том случае, если каждая строка состоит из более чем одного числа, разделенного ','., но это не так, как вы можете видеть в моем ответе. Если в строке нет ',', она просто создает list из одного элемента. Ты пробовал это? Какие результаты вы получаете? Показ нам ввода и вывода поможет.

r.ook 30.01.2019 20:33

Ваши исходные данные не все str, как предполагалось. Ваши последние два элемента, вероятно, int, поэтому вместо этого он возвращает NaN. Смотрите мой обновленный ответ.

r.ook 30.01.2019 20:40

Ты клевый волшебник, Гарри (Idlehands). Не могу поверить, что я упустил из виду эти целые ..

MaxB 30.01.2019 20:44

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