Как указать тип столбца в фрейме данных pandas

После выполнения этой строки

data['numbers'] = data.apply(lambda row : [1] * len(row.text), axis=1)

Столбец «числа» не является списком, как я ожидал, а имеет тип объекта, который не может быть проиндексирован, и я получаю IndexError.

В результате я хочу получить столбец с «числами», где в каждой строке столько единиц, сколько длина соответствующего текста в строке.

Как я могу это исправить?

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

Ответы 1

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

dtype из string, dict, list, set, tuple всегда является object, для тестирования type используйте:

data = pd.DataFrame({'text':['aaas','as']}, index=[10,12])

data['numbers'] = data.apply(lambda row : [1] * len(row.text), axis=1)

print (data['numbers'].apply(type))
0    <class 'list'>
1    <class 'list'>
Name: numbers, dtype: object

#check scalar
print (type(data.loc[0, 'numbers']))
<class 'list'>

Если хотите, проверьте lengths:

print (len(data.iloc[0, data.columns.get_loc('numbers')]))
4

data['lens'] = data['numbers'].str.len()
print (data)

    text       numbers  lens
10  aaas  [1, 1, 1, 1]     4
12    as        [1, 1]     2

Если я конвертирую DataFrame в серию pandas, тогда все в порядке, но если я попытаюсь повторить его, я получу indexError: например: len (data.iloc [0] ['numbers']) = 1, что не может быть правда, потому что после преобразования в ряд это список из 2000 элементов

Zarrie 02.05.2018 08:43

@Zarrie - Можете ли вы показать мне свой код с indexError?

jezrael 02.05.2018 08:43

Так что же вернуть print (len(data.iloc[0]['numbers']))?

jezrael 02.05.2018 08:51

Я не могу поделиться кодом, поскольку он является частью проекта, а сама ошибка составляет несколько сотен строк, поэтому я предполагаю, что мне придется справиться с ней в одиночку. Спасибо за попытку помочь!

Zarrie 02.05.2018 08:52

print (len (data.iloc [0] ['numbers'])) печатает 1 Я вижу, что на самом деле печать data.iloc [0] ['numbers'] является массивом ([list ([1,1,1,1 , 1 ...., 1,1,1])]) Это проблема?

Zarrie 02.05.2018 08:56

хммм, значит код для numbers не data['numbers'] = data.apply(lambda row : [1] * len(row.text), axis=1), верно?

jezrael 02.05.2018 08:58

Кажется, есть вложенные списки, а как же print (type(data.iloc[0]['numbers'][0]))?

jezrael 02.05.2018 09:03

Собственно это точный код для применения функции. После print(type(data.iloc[0]['numbers'][0])) получаю <class 'int'>

Zarrie 02.05.2018 09:05

Если использовать мой тестовый образец DataFrame, он вернет array([list([1,1,1,1])])? Какая у вас версия панд?

jezrael 02.05.2018 09:08

0.22.0 - это версия моих панд

Zarrie 02.05.2018 09:12

если в моем ответе использовать print ((data.iloc[0]['numbers'])) в DataFrame, получить array([list([1,1,1,1])])? Я не могу это смоделировать.

jezrael 02.05.2018 09:27

Извините, я не могу достаточно ясно объяснить, в чем моя проблема.

Zarrie 02.05.2018 09:40

@Zarrie - я переживал по этому поводу :( Лучше всего создать минимальный, полный и проверяемый пример

jezrael 02.05.2018 09:43

После долгой отладки я понял, что из-за того, что некоторые из моих образцов имеют NaN в столбце, после сохранения их в csv и последующего чтения в качестве первого элемента тип столбца не корректируется, что приводит к такому странному поведению. Спасибо за вашу готовность помочь!

Zarrie 02.05.2018 20:29

@Zarrie - Добро пожаловать! Если мой ответ был полезен, не забудьте его принимать - щелкните галочку рядом с ответом, чтобы переключить его с серого на заполненный. Спасибо.

jezrael 02.05.2018 20:35

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