Прочитайте файл 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)
Да; вы передаете данные более одного раза, так что вы могли бы добиться большего успеха с помощью более интеллектуального алгоритма однократного прохода. Но если производительность не является вашей главной задачей, я думаю, что это имеет преимущества с точки зрения краткости и удобочитаемости.