在空行处将 Pandas DataFrame 分割

5
我有一个大型数据框,需要按空行拆分。
以下是数据框的简化示例:
    A   B   C
0   1   0   International
1   1   1   International
2   NaN 2   International
3   1   3   International
4   1   4   International
5   8   0   North American
6   8   1   North American
7   8   2   North American
8   8   3   North American
9   NaN NaN NaN
10  1   0   Internal
11  1   1   Internal
12  6   0   East
13  6   1   East
14  6   2   East
...

正文:
如您所见,第9行为空白。我的需求是将0到8行放入不同的数据框中,以及10行到下一个空白行,这样最终就会有多个数据框。请注意,在寻找空白行时,整行都需要为空白。
以下是我用于查找空白行的代码:
def find_breaks(df):
    df_breaks = df[(df.loc[:,['A','B','C']].isnull()).any(axis=1)]
    print(df_breaks.index)

这段代码在简化的 DF 上测试时可以运行,但是我的真实 DataFrame 比 ['A','B','C'] 列多得多。
有什么方法可以找到下一个空行(或者像我上面做的一样,一次找到所有空行),而不必指定列名?
谢谢。
1个回答

10

如果我理解正确,可以使用pd.isnullnp.split

df_list = np.split(df, df[df.isnull().all(1)].index) 

for df in df_list:
    print(df, '\n') 

     A    B               C
0  1.0  0.0   International
1  1.0  1.0   International
2  NaN  2.0   International
3  1.0  3.0   International
4  1.0  4.0   International
5  8.0  0.0  North American
6  8.0  1.0  North American
7  8.0  2.0  North American
8  8.0  3.0  North American 

      A    B         C
9   NaN  NaN       NaN
10  1.0  0.0  Internal
11  1.0  1.0  Internal
12  6.0  0.0      East
13  6.0  1.0      East
14  6.0  2.0      East 

首先,获取整行为空的索引,然后使用它来将你的数据框分成块。np.split很好地处理数据框。

1
@LegitStack 另外,你的代码中有 任何一个 ... 而你需要的是 全部 (这确保它们全部为 True,而不仅仅是其中一两个)。 - cs95
@cs95 我们如何避免第二个数据框中所有NaN的行:9 NaN NaN NaN - Heinz
@Heinz 避免这行可能有点困难,但您可以使用 df_master = df_master.dropna(how='all') 将其删除。 - cs95
在这个解决方案中,np是什么? - Tomas Lucena
1
@TomasLucena numpy import numpy as np@TomasLucena numpy 导入numpy库,简写为np - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接