Pandas error " можно использовать только.ул. аксессу со строковыми значениями"
у меня есть следующий входной файл:
"Name",97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#,
и я читаю его с:
#!/usr/bin/env python
import pandas as pd
import sys
import numpy as np
filename = sys.argv[1]
df = pd.read_csv(filename,header=None)
for col in df.columns[2:]:
df[col] = df[col].str.extract(r'(d+.*d*)').astype(np.float)
print df
тем не менее, я получаю ошибку
df[col] = df[col].str.extract(r'(d+.*d*)').astype(np.float)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 2241, in __getattr__
return object.__getattribute__(self, name)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 188, in __get__
return self.construct_accessor(instance)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 528, in _make_str_accessor
raise AttributeError("Can only use .str accessor with string "
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
это сработало нормально в pandas 0.14, но не работает в pandas 0.17.0.
3 ответов
это происходит потому, что ваш последний столбец пуст, поэтому он преобразуется в NaN
:
In [417]:
t="""'Name',97.7,0A,0A,65M,0A,100M,5M,75M,100M,90M,90M,99M,90M,0#,0N#,"""
df = pd.read_csv(io.StringIO(t), header=None)
df
Out[417]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \
0 'Name' 97.7 0A 0A 65M 0A 100M 5M 75M 100M 90M 90M 99M 90M 0#
15 16
0 0N# NaN
если вы нарезать диапазон до последней строки, то он работает:
In [421]:
for col in df.columns[2:-1]:
df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df
Out[421]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 'Name' 97.7 0 0 65 0 100 5 75 100 90 90 99 90 0 0 NaN
в качестве альтернативы вы можете просто выбрать cols, которые являются object
dtype и запустите код (пропуская первый col, так как это запись "Name"):
In [428]:
for col in df.select_dtypes([np.object]).columns[1:]:
df[col] = df[col].str.extract(r'(\d+\.*\d*)').astype(np.float)
df
Out[428]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 'Name' 97.7 0 0 65 0 100 5 75 100 90 90 99 90 0 0 NaN
Я получил эту ошибку во время работы в Eclipse. Оказалось, что интерпретатор проекта был каким-то образом (после обновления, я считаю) сброшен на Python 2.7. Установка его обратно в Python 3.6 решила эту проблему. Все это привело к нескольким сбоям, перезапускам и предупреждениям. После нескольких минут неприятностей он кажется исправленным.
хотя я знаю, что это не решение проблемы, поставленной здесь, я подумал, что это может быть полезно для других, поскольку я пришел на эту страницу после поиска этой ошибки.
В этом случае мы должны использовать str.replace()
метод на этом ряду, но Сначала мы должны преобразовать его в str
тип:
df1.Patient = 's125','s45',s588','s244','s125','s123'
df1 = pd.read_csv("C:\Users\Gangwar\Desktop\competitions\cancer prediction\kaggle_to_students.csv")
df1.Patient = df1.Patient.astype(str)
df1['Patient'] = df1['Patient'].str.replace('s','').astype(int)