Как разбить фрейм данных на несколько фреймов на основе строк заголовка - PullRequest
0 голосов
/ 06 июня 2019

Мне нужно разделить фрейм данных на 3 уникальных фрейма данных на основе повторного создания строки заголовка в фрейме данных.

Мой фрейм данных выглядит следующим образом:

        0         1             2     ....   14
0   Alert     Type      Response           Cost
1     w1        x1            y1            z1
2     w2        x2            y2            z3
.      .         .             .             .
.      .         .             .             .
144 Alert     Type      Response           Cost
145   a1        b1            c1             d1
146   a2        b2            c2             d2

Я пытался получитьиндексные числа, содержащие слово «Alert» с loc для разбиения кадра данных на подкадры данных.

indexes = df.index[df.loc[df[0] == "Alert"]].tolist()

Но это возвращает:

IndexError: arrays used as indices must be of integer (or boolean) type

Любой намек на эту ошибку или есть даже способ, которого я не вижу (например, что-то вроде группировки по?)

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

@ piRSquared ответ отлично работает, поэтому позвольте мне объяснить вам ошибку.

Так вы можете получить индексы, где первый элемент - Alert:

indexes = list(df.loc[df['0'] == "Alert"].index)

Вашошибка возникает из-за того, что df.index является pandas.RangeIndex объектом, поэтому он не может быть далее проиндексирован.

Затем вы можете разделить ваш фрейм данных, используя следующее понимание списка:

listdf = [df.iloc[i:j] for i, j in zip(indexes, indexes[1:] + [len(df)])]
2 голосов
/ 06 июня 2019

np.split

dfs = np.split(df, np.flatnonzero(df[0] == 'Alert')[1:])

Объяснение

  • Найти, где df[0] равно 'Alert'

    np.flatnonzero(df[0] == 'Alert')
    
  • Игнорировать первый, потому что нам не нужен пустой элемент списка

    np.flatnonzero(df[0] == 'Alert')[1:]
    
  • Используйте np.split, чтобы получить список

    np.split(df, np.flatnonzero(df[0] == 'Alert')[1:])
    

результаты выставок

print(*dfs, sep='\n\n')

      0     1         2     14
0  Alert  Type  Response  Cost
1     w1    x1        y1    z1
2     w2    x2        y2    z3

        0     1         2     14
144  Alert  Type  Response  Cost
145     a1    b1        c1    d1
146     a2    b2        c2    d2
...