2017-09-05 12 views
3

このデータフレームをnumpy.nan行で分割されたデータフレームの辞書に変換するにはどうすればよいですか?このデータフレームを空白で分割するにはどうすればよいですか?

import pandas 
import numpy 
names = ['a', 'b', 'c'] 
df = pandas.DataFrame([1,2,3,numpy.nan, 4,5,6,numpy.nan, 7, 8,9]) 
>>> df 

     0 
0 1.0 
1 2.0 
2 3.0 
3 NaN 
4 4.0 
5 5.0 
6 6.0 
7 NaN 
8 7.0 
9 8.0 
10 9.0 

所望の出力:

df1 = 

     0 
0 1.0 
1 2.0 
2 3.0 

df2 = 

4 4.0 
5 5.0 
6 6.0 

df3 = 

8 7.0 
9 8.0 
10 9.0 

答えて

3

使用dict comprehension

d = {names[i]: x.dropna() for i, x in df.groupby(df[0].isnull().cumsum())} 

{'c':  0 
0 7.0 
1 8.0 
2 9.0, 'b':  0 
0 4.0 
1 5.0 
2 6.0, 'a':  0 
0 1.0 
1 2.0 
2 3.0} 

print (d['a']) 
    0 
0 1.0 
1 2.0 
2 3.0 

print (d['b']) 
    0 
4 4.0 
5 5.0 
6 6.0 

print (d['c']) 
     0 
8 7.0 
9 8.0 
10 9.0 
+0

あなたは絶対に正しいです。元の回答に戻ることはできますか? – jezrael

+1

私はメモを追加しました。 – Zero

1

df_dict = {'a': <df1>, 'b': <df2>, 'c': <df3>} 

はここで、もともと

In [2109]: df_dict = dict(zip(
          names, 
          [g.dropna() for _, g in df.groupby(df[0].isnull().cumsum())] 
          )) 
片道

です210

編集時には、別の回答と同じです。

groupby
In [2100]: df_dict = {names[i]: g.dropna() for i, g in df.groupby(df[0].isnull().cumsum())} 

In [2101]: df_dict['a'] 
Out[2101]: 
    0 
0 1.0 
1 2.0 
2 3.0 

In [2102]: df_dict['b'] 
Out[2102]: 
    0 
4 4.0 
5 5.0 
6 6.0 

In [2103]: df_dict['c'] 
Out[2103]: 
     0 
8 7.0 
9 8.0 
10 9.0 
+1

すなわち分割:(今答えは同じです:( – jezrael

2

もう一つの方法は、numpyの配列であるが

import numpy as np 
dic = {names[i]: j.dropna() for i,j in enumerate(np.array_split(df, np.where(df[0].isnull())[0]))} 
 
%%timeit 
dic = {names[i]: j.dropna() for i,j in enumerate(np.array_split(df, np.where(df[0].isnull())[0]))} 
100 loops, best of 3: 2.51 ms per loop 
%%timeit 
d = {names[i]: x.dropna() for i, x in df.groupby(df[0].isnull().cumsum())} 
100 loops, best of 3: 6.1 ms per loop 
関連する問題