如何根据标题行将数据帧分为多个数据帧

时间:2019-06-06 16:02:16

标签: python pandas dataframe indexing slice

我需要根据数据帧中再次出现的标头行将数据帧分为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

我试图使用loc来获取包含单词“ Alert”的索引号,以将数据帧切成子数据帧。

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

但这返回:

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

关于该错误的任何提示,或者甚至还有我看不到的方法(例如,像group by这样的东西?)

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

@piRSquared的答案很好用,所以让我向您解释错误。

这是获取第一个元素为Alert的索引的方法:

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

您的错误源于df.indexpandas.RangeIndex对象的事实,因此无法对其进行进一步索引。

然后,您可以使用如下列表理解来拆分数据框:

listdf = [df.iloc[i:j] for i, j in zip(indexes, indexes[1:] + [len(df)])]