2017-04-13 57 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