Как очистить файл CSV со смещенными столбцами? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть CSV-файл фильмов, которые я пытаюсь очистить.Я использую ноутбук Jupyter.

Он имеет 10000 строк и 5 столбцов.Ниже приведены некоторые примеры данных:

Movie Name      | Genre  | Date Released  | Length        | Rating      |
The Godfather   | Crime  | March 24, 1972 | 175           | R           |
The Avengers    | Action | May 5, 2012    | 143           | PG-13       |
The Dark Knight | Action | Crime          | July 18, 2008 | 152         | PG-13

Обратите внимание, что для «Темного рыцаря», поскольку существует 2 жанра, строки сдвигаются вправо.Я хочу очистить данные так, чтобы строка стала следующей:

The Dark Knight | Action, Crime | July 18, 2008 | 152 | PG-13

То, что я сделал (в блокноте Jupyter)

import pandas as pd
path = 'movies.csv'
df = pd.read_csv(path, header=0, names=['Movie Name', 'Genre', 'Date Released','Length','Rating','Extra'])

ctrCheck = 0
months = ["January","February","March","April","May","June","July","August","September","October","November","December"]

while ctrCheck < len(df.index):
    check = str(df['Date Released'][ctrCheck])
    if any(month in check for month in months):
        replaceStr = df.loc[ctrCheck, 'Genre'] + "," + df.loc[ctrCheck, 'Date Released']
        df.loc[ctrCheck, 'Genres'] = replaceStr
        df.loc[ctrCheck, 'Date Released'] = df.loc[ctrCheck, 'Length']
        df.loc[ctrCheck, 'Length'] = df.loc[ctrCheck, 'Rating']
        df.loc[ctrCheck, 'Rating'] = df.loc[ctrCheck, 'Extra']
    ctrCheck = ctrCheck + 1

df.drop(labels='Extra', inplace=True, axis='columns')

Есть ли лучший способ сделать это, кромеперебрать 10000 строк?

Спасибо!

1 Ответ

0 голосов
/ 18 ноября 2018

Если я правильно понимаю, вы ищете метод, который не включает явный цикл for и вместо этого использует векторизованные методы панд.

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

Поэтому я могу предложить следующий код:

import pandas as pd

# Name the last unnamed column
df = df.rename(columns={'Unnamed: 5': 'Extra'})

# Save the valid lines in a different dataframe
mask = (df['Extra'].isnull())
df_valid = df[mask]

# Fix the invalid lines
# Fix the Genre
df['Genre'] = df['Genre'] + ' ' + df['Date Released']
# Shift left the columns after 'Genre'
cols = df.columns[:-1]
df.drop('Date Released', axis=1, inplace=True)
df.columns = cols

# Restore valid lines
df.loc[mask, :] = df_valid

Полученный фрейм данных:

        Movie Name         Genre  Date Released Length Rating
0    The Godfather         Crime  March 24 1972    175      R
1     The Avengers        Action     May 5 2012    143  PG-13
2  The Dark Knight  Action Crime   July 18 2008    152  PG-13

Примечание Этот метод работает только в том случае, если максимальное количество жанров в одном фильме равно 2, что в случае, если я правильно понимаю:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...