2015-04-19 3 views
0

Я новичок в использовании фреймов данных Pandas. У меня есть данные в формате CSV, как это:Split pandas dataframe by String

foo, 1234, 
bar, 4567 
stuff, 7894 
New Entry,, 
morestuff,1345 

Я читал его в dataframe с

df = pd.read_csv 

Но что я действительно хочу это новый dataframe (или способ разделения тока один) каждый раз, когда у меня есть строка «Новая запись» (очевидно, без ее включения). Как это можно сделать?

ответ

1

1) Делать это на лету во время чтения файла строка за строкой и проверки NewEntry перерыв - это один подход.

2) Другой способ, если dataframe уже существует, чтобы найти NewEntry и нарезать dataframe на несколько из них, чтобы dff = {}

df                 
     col1 col2 
0  foo 1234  
1  bar 4567     
2  stuff 7894               
3 NewEntry NaN      
4 morestuff 1345 

Найти NewEntry строки, добавьте [-1] и [len(df.index)] для граничных условий

rows = [-1] + np.where(df['col1']=='NewEntry')[0].tolist() + [len(df.index)] 
[-1, 3L, 5] 

Создать диктофон информационных кадров

dff = {}                    
for i, r in enumerate(rows[:-1]):             
    dff[i] = df[r+1: rows[i+1]]              

Dict из dataframes {0: datafram1, 1: dataframe2}

dff       
{0:  col1 col2    
0 foo 1234    
1 bar 4567    
2 stuff 7894, 1:   col1 col2 
4 morestuff 1345} 

Dataframe 1

dff[0]    
    col1 col2  
0 foo 1234  
1 bar 4567  
2 stuff 7894  

Dataframe 2

dff[1]    
     col1 col2 
4 morestuff 1345 
+0

Хороший ответ. Быстрый вопрос .. как бы я обрабатывал данные, которые «NewEntry» для начала? Как в newEntry было название каждого раздела, а не разделителя? – user2757902

1

Итак, используя ваши данные примера, которые я объединил 3 раза, после загрузки (я для удобства называл коллы 'a', 'b', 'c'), мы находим индексы, в которых у вас есть «Новая запись» и выведите список кортежей этих позиций поэтапно, чтобы отметить крайний диапазон.

Затем мы можем перебрать этот список кортежей и нарежьте Orig ФР и добавить в список:

In [22]: 

t="""foo,1234, 
bar,4567 
stuff,7894 
New Entry,, 
morestuff,1345""" 
df = pd.read_csv(io.StringIO(t),header=None,names=['a','b','c']) 
df = pd.concat([df]*3, ignore_index=True) 
df 
Out[22]: 
      a  b c 
0   foo 1234 NaN 
1   bar 4567 NaN 
2  stuff 7894 NaN 
3 New Entry NaN NaN 
4 morestuff 1345 NaN 
5   foo 1234 NaN 
6   bar 4567 NaN 
7  stuff 7894 NaN 
8 New Entry NaN NaN 
9 morestuff 1345 NaN 
10  foo 1234 NaN 
11  bar 4567 NaN 
12  stuff 7894 NaN 
13 New Entry NaN NaN 
14 morestuff 1345 NaN 
In [30]: 

import itertools 
idx = df[df['a'] == 'New Entry'].index 
idx_list = [(0,idx[0])] 
idx_list = idx_list + list(zip(idx, idx[1:])) 
idx_list 

​ 
Out[30]: 
[(0, 3), (3, 8), (8, 13)] 
In [31]: 

df_list = [] 
for i in idx_list: 
    print(i) 
    if i[0] == 0: 
     df_list.append(df[i[0]:i[1]]) 
    else: 
     df_list.append(df[i[0]+1:i[1]]) 
df_list 
(0, 3) 
(3, 8) 
(8, 13) 
Out[31]: 
[  a  b c 
0 foo 1234 NaN 
1 bar 4567 NaN 
2 stuff 7894 NaN,   a  b c 
4 morestuff 1345 NaN 
5  foo 1234 NaN 
6  bar 4567 NaN 
7  stuff 7894 NaN,    a  b c 
9 morestuff 1345 NaN 
10  foo 1234 NaN 
11  bar 4567 NaN 
12  stuff 7894 NaN]