可以根据行值拆分熊猫数据帧吗



我有一个pandas数据帧,它有效地包含了几个不同的数据集。每个数据集之间有一行NaN。我可以将NaN行上的数据帧拆分为两个数据帧吗?提前谢谢。

您可以使用它基于所有NaN行拆分为许多数据帧:

#index of all NaN rows (+ beginning and end of df)
idx = [0] + df.index[df.isnull().all(1)].tolist() + [df.shape[0]]
#list of data frames split at all NaN indices
list_of_dfs = [df.iloc[idx[n]:idx[n+1]] for n in range(len(idx)-1)]

如果您想从分割数据帧中排除NaN行:

idx = [-1] + df.index[df.isnull().all(1)].tolist() + [df.shape[0]]
list_of_dfs = [df.iloc[idx[n]+1:idx[n+1]] for n in range(len(idx)-1)]

示例:

df:

0    1
0  1.0  1.0
1  NaN  1.0
2  1.0  NaN
3  NaN  NaN
4  NaN  NaN
5  1.0  1.0
6  1.0  1.0
7  NaN  1.0
8  1.0  NaN
9  1.0  NaN

list_of_dfs:

[     0    1
0  1.0  1.0
1  NaN  1.0
2  1.0  NaN, 
Empty DataFrame
Columns: [0, 1]
Index: [],   
0    1
5  1.0  1.0
6  1.0  1.0
7  NaN  1.0
8  1.0  NaN
9  1.0  NaN]

使用df[df[COLUMN_NAME].isnull()].index.tolist()获取与NaN行相对应的索引列表。然后,您可以使用索引将数据帧拆分为多个数据帧。

我的解决方案允许将DataFrame拆分为任意数量的块,在满是NaNs的每一行上。

假设输入DataFrame包含:

A    B     C
0   10.0  Abc  20.0
1   11.0  NaN  21.0
2   12.0  Ghi   NaN
3    NaN  NaN   NaN
4    NaN  Hkx  30.0
5   21.0  Jkl  32.0
6   22.0  Mno  33.0
7    NaN  NaN   NaN
8   30.0  Pqr  40.0
9    NaN  Stu   NaN
10  32.0  Vwx  44.0

使得";"分割点";是索引为37的行。

完成任务:

  1. 生成分组标准系列:

    grp = (df.isnull().sum(axis=1) == df.shape[1]).cumsum()
    
  2. 删除满NaN的行,并根据上述标准对结果进行分组:

    gr = df.dropna(axis=0, thresh=1).groupby(grp)
    

    thresh=1意味着对于当前行,在结果中保留1NaN值就足够了。

  3. 执行实际拆分,如列表理解:

    result = [ gr.get_group(key) for key in gr.groups ]
    

要打印结果,您可以运行:

for i, chunk in enumerate(result):
print(f'Chunk {i}:')
print(chunk, end='nn')

获取:

Chunk 0:
A    B     C
0  10.0  Abc  20.0
1  11.0  NaN  21.0
2  12.0  Ghi   NaN
Chunk 1:
A    B     C
4   NaN  Hkx  30.0
5  21.0  Jkl  32.0
6  22.0  Mno  33.0
Chunk 2:
A    B     C
8   30.0  Pqr  40.0
9    NaN  Stu   NaN
10  32.0  Vwx  44.0

最新更新