2016-04-08 2 views
2

у меня есть CSV-файл с форматом, как это:Разделить Панда Dataframe на несколько меньших dataframes на основе пустых строк

Header 1, Header 2, Header 3 
''   ''  '' 
value 1, value2, value 3 
value 1, value2, value 3 
value 1, value2, value 3 
''   ''  '' 
value 1, value 2, value 3 
value 1, value 2, value 3 
value 1, value 2, value 3 
''   ''  '' 

Я могу читать его в панде dataframe, но сегменты, окруженные пустыми строками (обозначаемый по '') должны обрабатываться индивидуально. Каким будет самый простой способ разделить их на более мелкие фреймы данных, основанные на том, что они находятся между пустыми строками? У меня довольно много таких сегментов.

Было бы проще разделить их на более мелкие фреймы данных или удалить сегмент из исходной части данных после его обработки еще проще?

EDIT: ответ

Ians был правильным, но в моем случае некоторые из моих файлов не было просто без кавычек в пустых строках, так что тип не является строкой. Я изменил свой ответ немного, и это работало на них:

df['counter'] = (df['Header 1'].isnull()).cumsum() 
df = df[df['Header 1'].isnull() == False] # remove empty rows 
df.groupby('counter').apply(lambda df: df.iloc[0]) 
+1

Простейшим было бы добавить счетчик, который увеличивается каждый раз, когда он встречает пустую строку. Затем вы можете получить свои отдельные данные с помощью 'df.groupby ('counter')'. Если вы заинтересованы, я могу написать ответ. – IanS

+0

Это хорошая идея, я попробую написать ее на моем конце, но если вы напишете, я буду принимать ее в качестве ответа – GreenGodot

ответ

1

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

df['counter'] = (df['Header1'] == "''").cumsum() 
df = df[df['Header1'] != "''"] # remove empty rows 
df.groupby('counter').apply(lambda df: df.iloc[0]) 

Последняя строка применяет вашу функцию обработки к каждому кадру данных отдельно (я просто поместил фиктивный пример).

Обратите внимание, что точное тонирование условий для пустых строк (здесь df['Header1'] == "''") должно быть адаптировано к вашей конкретной ситуации.

3

Я думаю, что вы можете найти пустые строки по str.contains, создать счетчик series по cumsum, groupby она и в цикле вы получаете небольшую DataFrames:

print df['Header 1'].str.contains("''").cumsum() 
0 1 
1 1 
2 1 
3 1 
4 2 
5 2 
6 2 
7 2 
8 3 
Name: Header 1, dtype: int32 

for idx, group in df.groupby(df['Header 1'].str.contains("''").cumsum()): 
    print idx 
    print group[1:] 
1 
    Header 1 Header 2 Header 3 
1 value 1 value2  value 3 
2 value 1 value2  value 3 
3 value 1 value2  value 3 
2 
    Header 1 Header 2 Header 3 
5 value 1 value 2  value 3 
6 value 1 value 2  value 3 
7 value 1 value 2  value 3 
3 
Empty DataFrame 
Columns: [Header 1, Header 2, Header 3] 
Index: [] 

Если вы хотите, вы можете создать словарь DataFrames:

dfs = {} 
for idx, group in df.groupby(df['Header 1'].str.contains("''").cumsum()): 
    dfs.update({idx:group[1:]})