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

时间:2020-07-13 03:59:58

标签: python pandas numpy dataframe

我有一个熊猫数据框,它有效地包含几个不同的数据集。在每个数据集之间都是充满NaN的行。我可以将NaN行上的数据框拆分为两个数据框吗?预先感谢。

3 个答案:

答案 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 的行。

要执行任务:

  1. 生成分组条件系列

     grp = (df.isnull().sum(axis=1) == df.shape[1]).cumsum()
    
  2. 丢弃充满 NaN 的行,并按照上述标准将结果分组:

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

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

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

     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