После выполнения этой строки
data['numbers'] = data.apply(lambda row : [1] * len(row.text), axis=1)
Столбец «числа» не является списком, как я ожидал, а имеет тип объекта, который не может быть проиндексирован, и я получаю IndexError.
В результате я хочу получить столбец с «числами», где в каждой строке столько единиц, сколько длина соответствующего текста в строке.
Как я могу это исправить?
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'>
Если хотите, проверьте length
s:
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
@Zarrie - Можете ли вы показать мне свой код с indexError
?
Так что же вернуть print (len(data.iloc[0]['numbers']))
?
Я не могу поделиться кодом, поскольку он является частью проекта, а сама ошибка составляет несколько сотен строк, поэтому я предполагаю, что мне придется справиться с ней в одиночку. Спасибо за попытку помочь!
print (len (data.iloc [0] ['numbers'])) печатает 1 Я вижу, что на самом деле печать data.iloc [0] ['numbers'] является массивом ([list ([1,1,1,1 , 1 ...., 1,1,1])]) Это проблема?
хммм, значит код для numbers
не data['numbers'] = data.apply(lambda row : [1] * len(row.text), axis=1)
, верно?
Кажется, есть вложенные списки, а как же print (type(data.iloc[0]['numbers'][0]))
?
Собственно это точный код для применения функции. После print(type(data.iloc[0]['numbers'][0]))
получаю <class 'int'>
Если использовать мой тестовый образец DataFrame, он вернет array([list([1,1,1,1])])
? Какая у вас версия панд?
0.22.0 - это версия моих панд
если в моем ответе использовать print ((data.iloc[0]['numbers']))
в DataFrame
, получить array([list([1,1,1,1])])
? Я не могу это смоделировать.
Извините, я не могу достаточно ясно объяснить, в чем моя проблема.
@Zarrie - я переживал по этому поводу :( Лучше всего создать минимальный, полный и проверяемый пример
После долгой отладки я понял, что из-за того, что некоторые из моих образцов имеют NaN в столбце, после сохранения их в csv и последующего чтения в качестве первого элемента тип столбца не корректируется, что приводит к такому странному поведению. Спасибо за вашу готовность помочь!
@Zarrie - Добро пожаловать! Если мой ответ был полезен, не забудьте его принимать - щелкните галочку рядом с ответом, чтобы переключить его с серого на заполненный. Спасибо.
Если я конвертирую DataFrame в серию pandas, тогда все в порядке, но если я попытаюсь повторить его, я получу indexError: например: len (data.iloc [0] ['numbers']) = 1, что не может быть правда, потому что после преобразования в ряд это список из 2000 элементов