Прочитайте файл CSV, который нуждается в очистке данных перед загрузкой в ​​фрейм данных

Я читаю файл CSV в панд. Проблема заключается в том, что файл требует удаления строк и вычисленных значений в других строках. Моя текущая идея начинается так

    with open(down_path.name) as csv_file:
    rdr = csv.DictReader(csv_file)
    for row in rdr:
        type = row['']
        if type == 'Summary':
            current_ward = row['Name']
        else:
            name = row['Name']
            count1 = row['Count1']
            count2 = row['Count2']
            count3 = row['Count3']
            index_count += 1
        # write to someplace

,Name,count1,count2,count3
Ward Summary,Aloha 1,35,0,0
Individual Statistics,John,35,0,0
Ward Summary,Aloha I,794,0,0
Individual Statistics,Walter,476,0,0
Individual Statistics,Deborah,182,0,0

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

Braindead способ сделать это, просто сделать мои преобразования и создать новый CSV-файл, а затем прочитать его. Похоже, непитонический путь.

Необходимо убрать итоговые строки, объединить их с похожими именами (Алоха 1 и Алоха I), удалить индивидуальную статистическую информацию и нанести ярлык Алоха 1 на каждого человека. Плюс мне нужно добавить, с какого месяца эти данные. Как видите, данные требуют некоторой работы:)

желаемый результат будет 16 января, Алоха 1, Джон 1,2,3

Откуда Алоха 1 взята из итоговой строки над ней

1 ответ

Решение

Мое личное предпочтение - делать все в Пандах.

Возможно, как-то так...

# imports
import numpy as np
import pandas as pd
from StringIO import StringIO

# read in your data
data = """,Name,count1,count2,count3
Ward Summary,Aloha 1,35,0,0
Individual Statistics,John,35,0,0
Ward Summary,Aloha I,794,0,0
Individual Statistics,Walter,476,0,0
Individual Statistics,Deborah,182,0,0"""
df = pd.read_csv(StringIO(data))

# give the first column a better name for convenience
df.rename(columns={'Unnamed: 0':'Desc'}, inplace=True)

# create a mask for the Ward Summary lines
ws_mask = df.Desc == 'Ward Summary'

# create a ward_name column that has names only for Ward Summary lines
df['ward_name'] = np.where(ws_mask, df.Name, np.nan)

# forward fill the missing ward names from the previous summary line
df.ward_name.fillna(method='ffill', inplace=True)

# get rid of the ward summary lines
df = df.ix[~ws_mask]

# get rid of the Desc column
df.drop('Desc', axis=1)

Да; вы передаете данные более одного раза, так что вы могли бы добиться большего успеха с помощью более интеллектуального алгоритма однократного прохода. Но если производительность не является вашей главной задачей, я думаю, что это имеет преимущества с точки зрения краткости и удобочитаемости.

Другие вопросы по тегам