2017-04-13 61 views
1

我有这样的数据帧的熊猫:提取子DataFrames

NaN 
1 
NaN 
452 
1175 
12 
NaN 
NaN 
NaN 
145 
125 
NaN 
1259 
2178 
2514 
1 

在另一方面,我有这等数据框:

1 
2 
3 
4 
5 
6 

我想第一个进入型动物中分离像这样的子数据帧:

DataFrame 1: 
    1 
DataFrame 2: 
    452 
    1175 
    12 
DataFrame 3: 

DataFrame 4: 

DataFrame 5: 
    145 
    125 
DataFrame 6: 
    1259 
    2178 
    2514 
    1 

我该怎么做,没有循环?

+2

输入的输出如何映射这不是真的我清楚。 –

+0

特别是*其他数据帧*让我困惑。也许有一个'5'缺失? – zinjaai

+0

每次我在第一个数据框中找到一个NaN值,并使用我发现的所有值构建它直到下一个NaN时,我必须创建一个子数据框。 – Ralk

回答

2

更新:感谢@piRSquared指出上述解决方案不适用于具有非数字索引的DF/Series。下面是更通用的解决方案:

dfs = [x.dropna() 
     for x in np.split(df, np.arange(len(df))[df['column'].isnull().values])] 

OLD答案:

IIUC你可以做这样的事情:

来源DF:

In [40]: df 
Out[40]: 
    column 
0  NaN 
1  1.0 
2  NaN 
3 452.0 
4 1175.0 
5  12.0 
6  NaN 
7  NaN 
8  NaN 
9 145.0 
10 125.0 
11  NaN 
12 1259.0 
13 2178.0 
14 2514.0 
15  1.0 

解决方案:

In [31]: dfs = [x.dropna() 
       for x in np.split(df, df.index[df['column'].isnull()].values+1)] 

In [32]: dfs[0] 
Out[32]: 
Empty DataFrame 
Columns: [column] 
Index: [] 

In [33]: dfs[1] 
Out[33]: 
    column 
1  1.0 

In [34]: dfs[2] 
Out[34]: 
    column 
3 452.0 
4 1175.0 
5 12.0 

In [35]: dfs[3] 
Out[35]: 
Empty DataFrame 
Columns: [column] 
Index: [] 

In [36]: dfs[4] 
Out[36]: 
Empty DataFrame 
Columns: [column] 
Index: [] 

In [37]: dfs[4] 
Out[37]: 
Empty DataFrame 
Columns: [column] 
Index: [] 

In [38]: dfs[5] 
Out[38]: 
    column 
9 145.0 
10 125.0 

In [39]: dfs[6] 
Out[39]: 
    column 
12 1259.0 
13 2178.0 
14 2514.0 
15  1.0 
+0

我得到这个错误:AttributeError:'DataFrame'对象没有'dtype'属性 – Ralk

+1

我必须记得使用'np.split'。此外,这依赖于像'np.arange(len(df))' – piRSquared

+0

这样的索引。我是否必须将Panda的DataFrame转换为numpy? – Ralk

1
w = np.append(np.where(np.isnan(df.iloc[:, 0].values))[0], len(df)) 
splits = {'DataFrame{}'.format(c): df.iloc[i+1:j] 
      for c, (i, j) in enumerate(zip(w, w[1:]))} 

打印出来splits证明

for k, v in splits.items(): 
    print(k) 
    print(v) 
    print() 

DataFrame0 
    0 
1 1.0 

DataFrame1 
     0 
3 452.0 
4 1175.0 
5 12.0 

DataFrame2 
Empty DataFrame 
Columns: [0] 
Index: [] 

DataFrame3 
Empty DataFrame 
Columns: [0] 
Index: [] 

DataFrame4 
     0 
9 145.0 
10 125.0 

DataFrame5 
     0 
12 1259.0 
13 2178.0 
14 2514.0 
15  1.0