У меня есть фрейм данных, который содержит строку различной длины в каждой ячейке, т.е.
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
str.split разбивает строку, используя заданный разделитель (pandas.pydata.org/pandas-docs/stable/reference/api/…). Тип каждой ячейки не является строкой, поэтому вы получаете эту ошибку!
Я думаю, вы должны сделать df[ df['Num'].size > 1 ]['Num'].str.split(','). Но вопрос, который вы задаете, может быть шире. Вы должны написать правильный вопрос с минимальный воспроизводимый пример.
df['Num'].size — это свойство, а не метод. df['Num'].size() - это место, где возникает ошибка.
Почему бы не просто df['Num'].str.split(',')? Вы хотели, чтобы (9) не был в list, как остальные в колонке? Не похоже, что разделение (9) вызовет какие-либо проблемы... оно просто не разделится. Также size не то, что вы думаете...
Извините, позвольте мне немного пояснить. Я хочу, чтобы отдельные числа были преобразованы в список из одного элемента, а все остальное — в список из нескольких элементов.
@jpp Я обновил вопрос, и да, это наверняка строки.






Предполагая, что ваш столбец состоит из строк, и вам просто нужны отдельные числа как 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]
Я опубликовал обновление, чтобы лучше объяснить, к сожалению, ваш пример был не совсем тем, что я искал.
В своем редактировании вы сказали df['Adj'].str.split(',') работает только в том случае, если каждая строка состоит из более чем одного числа, разделенного ','., но это не так, как вы можете видеть в моем ответе. Если в строке нет ',', она просто создает list из одного элемента. Ты пробовал это? Какие результаты вы получаете? Показ нам ввода и вывода поможет.
Ваши исходные данные не все str, как предполагалось. Ваши последние два элемента, вероятно, int, поэтому вместо этого он возвращает NaN. Смотрите мой обновленный ответ.
Ты клевый волшебник, Гарри (Idlehands). Не могу поверить, что я упустил из виду эти целые ..
Являются ли эти строки или кортежи, например. что вы видите для
type(df['Num'].iat[0])иtype(df['Num'].iat[2])?