Split pandas dataframe by String

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

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

Я читаю его в dataframe с помощью

  df = pd.read_csv 

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

2 Solutions collect form web for “Split pandas dataframe by String”

1) Выполнение этого на лету при чтении файла по очереди и проверка на разрыв NewEntry – это один из подходов.

2) Другой способ, если уже существует NewEntry заключается в том, чтобы найти NewEntry и NewEntry на несколько из них на 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 данных-кадров {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 

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

Затем мы можем перебрать этот список кортежей и нарезать ориг df и добавить в список:

 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]: abc 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]: [ abc 0 foo 1234 NaN 1 bar 4567 NaN 2 stuff 7894 NaN, abc 4 morestuff 1345 NaN 5 foo 1234 NaN 6 bar 4567 NaN 7 stuff 7894 NaN, abc 9 morestuff 1345 NaN 10 foo 1234 NaN 11 bar 4567 NaN 12 stuff 7894 NaN]  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]: abc 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]: [ abc 0 foo 1234 NaN 1 bar 4567 NaN 2 stuff 7894 NaN, abc 4 morestuff 1345 NaN 5 foo 1234 NaN 6 bar 4567 NaN 7 stuff 7894 NaN, abc 9 morestuff 1345 NaN 10 foo 1234 NaN 11 bar 4567 NaN 12 stuff 7894 NaN] 
  • Как читать и редактировать электронные таблицы Google с помощью Python 3.x?
  • Использование Zip для чтения файла по вертикали и поиска по заархивированному списку
  • Результат функции сохранения в переменную
  • Webdriver не может пройти, нажав кнопку следующей страницы
  • Как получить IPython Notebook для запуска Python 3?
  • Unpickling python2 datetime под python3
  • Python: Pandas, текстовый файл в DataFrame
  • Загрузка локального файла с клиента на распределенный кластер dask
  • Python - лучший язык программирования в мире.