我有一个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
使得";"分割点";是索引为3和7的行。
完成任务:
生成分组标准系列:
grp = (df.isnull().sum(axis=1) == df.shape[1]).cumsum()
删除满NaN的行,并根据上述标准对结果进行分组:
gr = df.dropna(axis=0, thresh=1).groupby(grp)
thresh=1
意味着对于当前行,在结果中保留1非NaN值就足够了。执行实际拆分,如列表理解:
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