2016-06-14 3 views
1

У меня есть файл csv, импортированный в dataframe pandas. Вероятно, это произошло из экспорта базы данных, который объединял таблицу «один ко многим родителям и деталями». Формат файла CSV выглядит следующим образом:синтаксический анализ CSV в pandas dataframes (один-ко-многим unmunge)

header1, header2, header3, header4, header5, header6 

sample1, property1,,,average1,average2 
,,detail1,detail2,, 
,,detail1,detail2,, 
,,detail1,detail2,, 

sample2, ... 
,,detail1,detail2,, 
,,detail1,detail2,, 
... 

(т.е. line 0 является header, line 1 является record 1, lines 2 через n являются детали, линия п + 1 является запись 2 и так далее ...)

Каков наилучший способ извлечения (перенормировать?) Детали в отдельные DataFrames, на которые можно ссылаться, используя значения в записях sample#? Количество каждого подмножества деталей различно для каждого образца.

можно использовать:

samplelist = df.header2[pd.notnull(df.header2)] 

, чтобы получить начальный индекс каждого образца, так что я могу захватить samplelist.index [0] для samplelist.index [1] и положить его в меньшем dataframe. Подробные записи сами по себе не имеют ссылки на какой образец, из которого они пришли, поэтому это должно быть выведено из порядка файла csv (обратите внимание, что в моем примере нет пересечения заполненных/пустых полей).

Должен ли я составлять список фреймов данных, спецификацию данных или панель данных?

Могу ли я каким-то образом создавать переменные из полей записи sample1 и каким-то образом присоединять их к каждому файлу данных, который имеет только подробные записи (например, совокупность объектов, которые имеют несколько скалярных элементов и один фрейм данных каждый)?

В конце концов я создам статистические данные по каждой группе подробных записей и нарисую их на значения в образцах образцов (например, sampletype, день или дата и т. Д. Против мистика). Я создам промежуточные серии, которые также будут прикреплены к группировке образцов, например, с оценкой плотности ядра PDF или гистограммой.

Спасибо.

ответ

0

Вы можете использовать тот факт, что первая column кажется пустым, если это не новый sample запись в .fillna(method='ffill'), а затем .groupby('header1') получить все отдельные группы. На этом вы можете рассчитать статистику сразу или сохранить как отдельный DataFrame. Эскиз высокого уровня следующим образом:

df.header1 = df.header1.fillna(method='ffill') 
for sample, data in df.groupby('header1'): 
    print(sample) # access to sample name 
    data = ... # process sample records 
+0

Ваш пример позволяет мне получить в моих данных легко. Вперед заполнение было очень полезно. У меня есть ваш пример работы, только теперь каждый проход цикла 'for' должен сохранять' sample' и 'data' в некоторый новый объект. Я надеялся на два новых фрейма. Это просто потому, что я привык думать о таблицах SQL. Я все еще обдумываю, как эффективно использовать объект groupby. –

0

Ответ выше дал мне направление в правильном направлении. При дальнейшей работе использовалось следующее. Оказывается, мне нужно было использовать два столбца в качестве составного ключа для уникальной идентификации образцов.

df.header1 = df.header1.fillna(method='ffill') 
df.header2 = df.header2.fillna(method='ffill') 

grouped = df.groupby(['header1','header2']) 

samplelist = [] 
dfParent = pd.DataFrame() 
dfDetail = pd.DataFrame() 

for sample, data in grouped: 
    samplelist.append(sample) 
    dfParent = dfParent.append(grouped.get_group(sample).head(n=1), ignore_index=True) 
    dfDetail = dfDetail.append(data[1:], ignore_index=True) 

dfParent = dfParent.drop(['header3','header4',etc...]) # remove columns only used in 
                 # detail records 
dfDetail = dfDetail.drop(['header5','header6',etc...]) # remove columns only used once 
                 # per sample 

# Now details can be extracted by sample number in the sample list 
# (e.g. the first 10 for sample 0) 

samplenumber = 0 

dfDetail[ 
    (dfDetail['header1'] == samplelist[samplenumber][0]) & 
    (dfDetail['header2'] == samplelist[samplenumber][1]) 
    ].header3[:10] 

Полезные ссылки были:

Pandas groupby and get_group

Pandas append to DataFrame

Смежные вопросы