Python: как исключить определенные части строки при чтении из файла CSV - PullRequest
0 голосов
/ 11 октября 2018

Я очень плохо знаком с Python и пытаюсь прочитать файл CSV: `

1980,Mark,Male,Student,L,90,56,78,44,88
1982,Cindy,Female,Student,S,45,76,22,42,90
1984,Kevin,Male,Student,L,67,83,52,55,59
1986,Michael,Male,Student,M,94,63,73,60,43
1988,Anna,Female,Student,S,66,50,59,57,33
1990,Jessica,Female,Student,S,72,34,29,69,27
1992,John,Male,Student,L,80,67,90,89,68
1994,Tom,Male,Student,M,23,60,89,78,39
1996,Nick,Male,Student,S,56,98,84,44,50
1998,Oscar,Male,Student,M,64,61,74,59,63
2000,Andy,Male,Student,M,11,50,93,69,90

Я бы хотел сохранить только определенные атрибуты этих данных в словарь или списоксписки.Например, я хотел бы только сохранить год, имя и пять цифр (подряд).Я не уверен, как исключить только средние три столбца.

Вот код, который у меня сейчас есть:

def read_data(filename):
    f = open("myfile.csv", "rt")
    import csv
    data = {}
    for line in f:
        row = line.rstrip().split(',')
        data[row[0]] = [e for e in row[5:]]

    return data

Я знаю только, как хранить куски столбцов вместе, но нетолько конкретные столбцы один за другим.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы можете использовать pd.read_csv() и передать желаемые имена столбцов:

import pandas as pd

df = pd.read_csv('csv1.csv', names=['Year','Name','Gender','ID1','ID2','Val1','Val2','Val3','Val4','Val5'])

desired = df[['Year','Name','Val1','Val2','Val3','Val4','Val5']]

Выход:

    Year     Name  Val1  Val2  Val3  Val4  Val5
0   1980     Mark    90    56    78    44    88
1   1982    Cindy    45    76    22    42    90
2   1984    Kevin    67    83    52    55    59
3   1986  Michael    94    63    73    60    43
4   1988     Anna    66    50    59    57    33
5   1990  Jessica    72    34    29    69    27
6   1992     John    80    67    90    89    68
7   1994      Tom    23    60    89    78    39
8   1996     Nick    56    98    84    44    50
9   1998    Oscar    64    61    74    59    63
10  2000     Andy    11    50    93    69    90

Другой вариант - передать индексные местоположения столбцов вперед с помощьюusecols, вот так:

df = pd.read_csv('csv1.csv', header=None, usecols=[0,1,5,6,7,8,9])

Обратите внимание, что при этом возвращается фрейм данных с индексным местоположением с именованными столбцами:

       0        1   5   6   7   8   9
0   1980     Mark  90  56  78  44  88
1   1982    Cindy  45  76  22  42  90
2   1984    Kevin  67  83  52  55  59
3   1986  Michael  94  63  73  60  43
4   1988     Anna  66  50  59  57  33
5   1990  Jessica  72  34  29  69  27
6   1992     John  80  67  90  89  68
7   1994      Tom  23  60  89  78  39
8   1996     Nick  56  98  84  44  50
9   1998    Oscar  64  61  74  59  63
10  2000     Andy  11  50  93  69  90
0 голосов
/ 11 октября 2018

Вы можете сделать это с помощью простого понимания списка:

def read_data(filename):
    f = open("myfile.csv", "rt")
    data = {}
    col_nums = [0, 1, 5, 6, 7, 8, 9]
    for line in f:
        row = line.rstrip().split(',')
        data[row[0]] = [row[i] for i in col_nums]

    return data

Вы также можете рассмотреть возможность использования Pandas для чтения и обработки данных:

import pandas as pd
df = pd.read_csv("myfile.csv", columns=['year', 'name', 'gender', 'kind', 'size', 'num1', 'num2', 'num3', 'num4', 'num5'])
data = df[['year', 'name', 'num1', 'num2', 'num3', 'num4', 'num5']]
0 голосов
/ 11 октября 2018

Вы можете попытаться разбить каждую строку и назначить ее явно для переменных;затем просто игнорируйте переменные, которые вы не будете использовать (я назвал их _, поэтому очевидно, что они не будут использоваться).

Это вызовет ошибки (в строке кода, которая имеет split()), еслистрока имеет меньше или больше, чем нужные поля.

def read_data(filename):
    data = {}

    with open(filename) as f:
        for line in f:
            line = line.strip()
            if len(line) > 0:
                year, name, _, _, _, n1, n2, n3, n4, n5 = line.split(',')
                data[year] = [n1, n2, n3, n4, n5]

    return data
...