Я копирую выходные данные списка из курса DataCamp, чтобы я мог воссоздать упражнение в коде Visual Studio или Jupyter Notebook. В интерактивном окне DataCamp Python я набираю имя списка, выделяю вывод и вставляю его в новый файл в VSCode. Я использую поиск и замену, чтобы удалить все запятые и пробелы, и теперь у меня 142 числовых значения, и я сохраняю как life_exp.csv. Выглядит так:

    43.828
    76.423
    72.301
    42.731
    75.32
    81.235
    79.829
    75.635
    64.062
    79.441

Когда я считываю файл в VSCode, используя Pandas read_csv или csv.reader, и использую values.tolist () с Pandas или цикл for для добавления существующего, пустого списка, оба случая предоставляют мне список списков, который затем не отображается данные правильно, когда я пытаюсь создать гистограммы matplotlib.

Я использовал NotePad для сохранения данных, а также .csv, и оба способа сохранения данных приводят к одной и той же проблеме.

import matplotlib.pyplot as plt 
import csv
life_exp = []

with open ('C:\data\life_exp.csv', 'rt') as life_expcsv:
    exp_read = csv.reader(life_expcsv, delimiter = '\n')
    for row in exp_read:
      life_exp.append(row)

А также

import pandas as pd 
life_exp_df = pd.read_csv('c:\\data\\life_exp.csv', header = None)
life_exp = life_exp_df.values.tolist()

Когда вы печатаете life_exp после импорта с использованием csv, вы получаете:

[['43.828'],
 ['76.423'],
 ['72.301'],
 ['42.731'],
 ['75.32'],
 ['81.235'],
 ['79.829'],
 ['75.635'],
 ['64.062'],
 ['79.441'],
 ['56.728'],
….

И когда вы печатаете life_exp после импорта с помощью pandas read_csv, вы получаете то же самое, но по крайней мере теперь это не строка:

[[43.828],
 [76.423],
 [72.301],
 [42.731],
 [75.32],
 [81.235],
 [79.829],
 [75.635],
 [64.062],
 [79.441],
 [56.728],
…

И когда вы вызываете plt.hist (life_exp) в любой версии списка, вы получаете каждое значение как bin из 1.

Я просто хочу прочитать каждое значение в CSV-файле и поместить каждое значение в простой список Python.

Я потратил дни на то, чтобы обыскивать стекопоток, думая, что кто-то это сделал, но не могу найти ответ. Я очень новичок в Python, поэтому ваша помощь очень ценится.

0
MSFTGirl 15 Авг 2019 в 19:08

2 ответа

Лучший ответ

Пытаться:

import pandas as pd 
life_exp_df = pd.read_csv('c:\\data\\life_exp.csv', header = None)

# Select the values of your first column as a list
life_exp = life_exp_df.iloc[:, 0].tolist()

Вместо того:

life_exp = life_exp_df.values.tolist()
1
M-M 15 Авг 2019 в 16:24

С помощью csv reader он будет анализировать строку в списке, используя предоставленный вами разделитель. В этом случае вы предоставляете \n в качестве разделителя, но он все равно возьмет этот единственный элемент и вернет его в виде списка.

Когда вы добавляете каждую строку, вы по существу добавляете этот список в другой список. Самый простой обходной путь - это индексирование в строку для извлечения этого значения.

with open ('C:\data\life_exp.csv', 'rt') as life_expcsv:
    exp_read = csv.reader(life_expcsv, delimiter = '\n')
    for row in exp_read:
        life_exp.append(row[0])

Однако, если ваши данные не гарантированно отформатированы так, как вы их предоставили, вам нужно будет обработать это немного иначе:

with open ('C:\data\life_exp.csv', 'rt') as life_expcsv:
    exp_read = csv.reader(life_expcsv, delimiter = '\n')
    for row in exp_read:
        for number in row:
            life_exp.append(number)

Немного чище с пониманием списка:

with open ('C:\data\life_exp.csv', 'rt') as life_expcsv:
    exp_read = csv.reader(life_expcsv, delimiter = '\n')
    [life_exp.append(number) for row in exp_read for number in row]
0
Adrian 15 Авг 2019 в 16:14