Панды читают CSV, где отсутствует один заголовок - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь прочитать CSV-файл с помощью Pandas, но первый столбец содержит имя и фамилию, разделенные запятой. Это заставляет Панд думать, что есть 5 столбцов вместо 4, поэтому последний столбец теперь не имеет заголовка, что делает его невозможным для выбора.

Файл выглядит так:

CustomerName,ClientID,EmailDate,EmailAddress
FNAME1,LNAME1,100,2019-01-13 00:00:00.000,FNAME1@HOTMAIL.COM
FNAME2,LNAME2,100,2019-01-13 00:00:00.000,FNAME2@GMAIL.COM
FNAME3,LNAME3,100,2019-01-13 00:00:00.000,FNAME3@AOL.COM
FNAME4,LNAME4,100,2019-01-13 00:00:00.000,FNAME40@GMAIL.COM
FNAME5,LNAME5,100,2019-01-13 00:00:00.000,FNAME5@AOL.COM

Как мой код выглядит сейчас:

def convert_ftp_data():
    file = os.getcwd() + "/data.csv"
    data = pd.read_csv(file, index_col=False)

data["first_name"] = data["CustomerName"].str.split().str[0].str.title()
data["email"] = data["EmailAddress"]

clean_data = data.drop(data[["CustomerName", "ClientID", "EmailDate", "EmailAddress"]], 1)

print(clean_data)

Используя мой код, я получаю следующий вывод:

first_name  email
0   FNAME1  2019-01-13 00:00:00.000
1   FNAME1  2019-01-13 00:00:00.000
2   FNAME1  2019-01-13 00:00:00.000
3   FNAME1  2019-01-13 00:00:00.000
4   FNAME1  2019-01-13 00:00:00.000

Мне нужно только выбрать поля FNAME и EmailAddress. Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Попробуйте следующее:

pd.read_csv(file, usecols=['EmailAddress']).reset_index().rename(columns={'index': 'first_name', 'EmailAddress': 'email'})

ВЫВОД:

    first_name  email
0   FNAME1      FNAME1@HOTMAIL.COM
1   FNAME2      FNAME2@GMAIL.COM
2   FNAME3      FNAME3@AOL.COM
3   FNAME4      FNAME40@GMAIL.COM
4   FNAME5      FNAME5@AOL.COM
0 голосов
/ 08 января 2019

Почему бы просто не пропустить заголовок и правильно установить его после импорта

data = pd.read_csv(file, index_col=False, header=None, skiprows=1)

data.columns = 'CustomerFirstName,CustomerName,ClientID,EmailDate,EmailAddress'.split(',')
0 голосов
/ 08 января 2019

Читать заголовки отдельно

С pd.read_csv вы можете использовать параметры nrows, skiprows и names:

from io import StringIO

x = """CustomerName,ClientID,EmailDate,EmailAddress
FNAME1,LNAME1,100,2019-01-13 00:00:00.000,FNAME1@HOTMAIL.COM
FNAME2,LNAME2,100,2019-01-13 00:00:00.000,FNAME2@GMAIL.COM
FNAME3,LNAME3,100,2019-01-13 00:00:00.000,FNAME3@AOL.COM
FNAME4,LNAME4,100,2019-01-13 00:00:00.000,FNAME40@GMAIL.COM
FNAME5,LNAME5,100,2019-01-13 00:00:00.000,FNAME5@AOL.COM"""

headers = pd.read_csv(StringIO(x), nrows=0).columns
headers = np.hstack((['FirstName', 'LastName'], headers[1:]))

df = pd.read_csv(StringIO(x), header=None, skiprows=[0], names=headers)

print(df)

#   FirstName LastName  ClientID                EmailDate        EmailAddress
# 0    FNAME1   LNAME1       100  2019-01-13 00:00:00.000  FNAME1@HOTMAIL.COM
# 1    FNAME2   LNAME2       100  2019-01-13 00:00:00.000    FNAME2@GMAIL.COM
# 2    FNAME3   LNAME3       100  2019-01-13 00:00:00.000      FNAME3@AOL.COM
# 3    FNAME4   LNAME4       100  2019-01-13 00:00:00.000   FNAME40@GMAIL.COM
# 4    FNAME5   LNAME5       100  2019-01-13 00:00:00.000      FNAME5@AOL.COM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...