熊猫按行值拆分/分组数据框

时间:2018-07-23 16:26:19

标签: python pandas

我具有以下格式的数据框

In [1]: df
Out [1]:
      A    B    C    D
 1    0    2    6    0
 2    6    1    5    2
 3  NaN  NaN  NaN  NaN
 4    9    3    2    2
 ...
15    2   12    5   23
16  NaN  NaN  NaN  NaN
17    8    1    5    3

我有兴趣按NaN行将数据帧分为多个数据帧(或对其进行分组)。

因此导致以下结果

In [2]: df1
Out [2]: 
      A    B    C    D
 1    0    2    6    0
 2    6    1    5    2

In [3]: df2
Out [3]:
      A    B    C    D
 1    9    3    2    2
 ...
12    2   12    5   23

In [4]: df3
Out [4]:
      A    B    C    D
 1    8    1    5    3

3 个答案:

答案 0 :(得分:4)

您可以使用compare-cumsum-groupby模式,在该模式中,我们找到所有为空的行,对这些行进行累加和以获取每个子组的组号,然后遍历这些组:

In [114]: breaks = df.isnull().all(axis=1)

In [115]: groups = [group.dropna(how='all') for _, group in df.groupby(breaks.cumsum())]

In [116]: for group in groups:
     ...:     print(group)
     ...:     print("--")
     ...:     
     A    B    C    D
1  0.0  2.0  6.0  0.0
2  6.0  1.0  5.0  2.0
--
      A     B    C     D
4   9.0   3.0  2.0   2.0
15  2.0  12.0  5.0  23.0
--
      A    B    C    D
17  8.0  1.0  5.0  3.0
--

答案 1 :(得分:2)

您可以将localgroupby分开使用

variables = locals()
for x, y in df.dropna(0).groupby(df.isnull().all(1).cumsum()[~df.isnull().all(1)]):
    variables["df{0}".format(x + 1)] = y

df1
Out[768]: 
     A    B    C    D
1  0.0  2.0  6.0  0.0
2  6.0  1.0  5.0  2.0
df2
Out[769]: 
      A     B    C     D
4   9.0   3.0  2.0   2.0
15  2.0  12.0  5.0  23.0

答案 2 :(得分:1)

我将groupbycumsum一起使用字典:

dictofdfs = {}
for n,g in df.groupby(df.isnull().all(1).cumsum()):
    dictofdfs[n]= g.dropna()

输出:

dictofdfs[0]

     A    B    C    D
1  0.0  2.0  6.0  0.0
2  6.0  1.0  5.0  2.0

dictofdfs[1]

      A     B    C     D
4   9.0   3.0  2.0   2.0
15  2.0  12.0  5.0  23.0

dictofdfs[2]

      A    B    C    D
17  8.0  1.0  5.0  3.0