Как читать столбец csv как список dtype с помощью pandas?
У меня есть файл csv с 3 столбцами, в котором каждая строка столбца 3 содержит список значений. Как видно из следующей структуры таблицы
Col1,Col2,Col3
1,a1,"['Proj1', 'Proj2']"
2,a2,"['Proj3', 'Proj2']"
3,a3,"['Proj4', 'Proj1']"
4,a4,"['Proj3', 'Proj4']"
5,a5,"['Proj5', 'Proj2']"
Всякий раз, когда я пытаюсь прочитать этот csv, Col3 читается как объект str, а не как список. Я попытался изменить dtype этого столбца для списка, но получил "Ошибка атрибута", как показано ниже
df = pd.read_csv("inputfile.csv")
df.Col3.dtype = list
AttributeError Traceback (most recent call last)
<ipython-input-19-6f9ec76b1b30> in <module>()
----> 1 df.Col3.dtype = list
C:\Python27\lib\site-packages\pandas\core\generic.pyc in __setattr__(self, name, value)
1953 object.__setattr__(self, name, value)
1954 except (AttributeError, TypeError):
-> 1955 object.__setattr__(self, name, value)
1956
1957 #----------------------------------------------------------------------
AttributeError: невозможно установить атрибут
Было бы здорово, если бы вы могли мне помочь, как это сделать.
Ответы
Ответ 1
Вы можете использовать ast lib:
from ast import literal_eval
df.Col3 = df.Col3.apply(literal_eval)
print(df.Col3[0][0])
Proj1
Вы также можете сделать это, когда вы создаете dataframe из csv, используя converters
:
df = pd.read_csv("in.csv",converters={"Col3": literal_eval})
Если вы уверены, что он одинаковый для всех строк, удаление и разделение будут намного быстрее:
df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").split(", ")})
Но вы получите строки, заключенные в кавычки
Ответ 2
Добавление замены к ответу Cunninghams:
df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").replace("'","").split(", ")})
Смотрите также pandas - конвертирует строку в список строк
Ответ 3
Попробуйте удалить скобки '[' и ']' из столбца. Затем используйте функцию python string split
, чтобы преобразовать ее в список.
df['Col3'] = df['Col3'].str.replace(']',"")
df['Col3'] = df['Col3'].str.replace('[',"")
df['Col3'] = df['Col3'].str.split()