2016-07-11 4 views
2

複数のデータセットが行単位で区切られたファイルがあります。私は、各データフレームは、国に対応する複数のデータフレームにファイル全体を読み込むためにパンダを使用したいパンダを使用して複数のデータセットを1つのファイルから読み込むにはどうすればよいですか?

country1 
0.9 
1.3 
2.9 
1.1 
... 
country2 
4.1 
3.1 
0.2 
... 

:それはのようになります。これを行う簡単な方法はありますか?各国のエントリ数は異なります。

答えて

5

maskto_numericerrors='coerce'で作成することができます。したがって、NaNは列名です。その後isnullでそれらを見つけるとcumsumでグループを作成します。

import pandas as pd 
import io 

temp=u"""country1 
0.9 
1.3 
2.9 
1.1 
country2 
4.1 
3.1 
0.2""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), index_col=None, header=None) 
print (df) 
      0 
0 country1 
1  0.9 
2  1.3 
3  2.9 
4  1.1 
5 country2 
6  4.1 
7  3.1 
8  0.2 
mask = pd.to_numeric(df.iloc[:,0], errors='coerce').isnull().cumsum() 
print (mask) 
0 1 
1 1 
2 1 
3 1 
4 1 
5 2 
6 2 
7 2 
8 2 
Name: 0, dtype: int32 

最終使用にlist comprehensiondataframesのリストについて:

dfs = [g[1:].rename(columns={0:g.iloc[0].values[0]}) for i, g in df.groupby(mask)] 

print (dfs) 

print (dfs[0]) 
    country1 
1  0.9 
2  1.3 
3  2.9 
4  1.1 

print (dfs[1]) 
    country2 
6  4.1 
7  3.1 
8  0.2 

必要reset index場合:

dfs = [g[1:].rename(columns={0:g.iloc[0].values[0]}).reset_index(drop=True) for i, g in df.groupby(mask)] 

print (dfs) 

print (dfs[0]) 
    country1 
0  0.9 
1  1.3 
2  2.9 
3  1.1 
print (dfs[1]) 
    country2 
0  4.1 
1  3.1 
2  0.2 
+1

このソリューション@ArturJは関係なく、国が数値的に順序付けられているかどうかの動作するはずです。 jezraelは、 'is_numeric'を使って** not **数値のエントリを識別し、サブデータフレームの終わりと終わりを識別できるようにします。これは、データそのものが数値でない場合、または国名が「5.3」の場合にのみ問題になります。ボトムライン、あなたは良いことをする必要があります。 – piRSquared

+1

@ArturJまた、これがあなたの質問に答える場合は、それを答えとして記入してください。フォローアップの質問がある場合は、別の質問をしてください。 – piRSquared

1

パンダはcsvやjsonのような標準的なファイルフォーマットをサポートしていますが、これはそれらの1つではありません。手作業でファイルを再フォーマットすることは時間の無駄だと思っており、with open(...) as f:f.readlines()をpythonオブジェクトに使用して自分でファイルを解析することをお勧めします。

あなたがいることをやったと言うと、フォーマットがdataのように見え、その後、from_dict()は動作するはずです:

data = { "countryName1": [0.9, 1.3, ...], "countryName2": [...]} 
df = pd.DataFrame.from_dict(data) 
関連する問題