我有一个熊猫数据框,它有效地包含几个不同的数据集。在每个数据集之间都是充满NaN的行。我可以将NaN行上的数据框拆分为两个数据框吗?预先感谢。
答案 0 :(得分:2)
您可以使用它根据所有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]
答案 1 :(得分:0)
使用df[df[COLUMN_NAME].isnull()].index.tolist()
获取与NaN行相对应的索引列表。然后,您可以使用索引将数据框拆分为多个数据框。
答案 2 :(得分:0)
我的解决方案允许将您的DataFrame分成任意个块, 在充满 NaN s的每一行上。
假定输入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='\n\n')
获取:
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