2016-08-31 11 views
1

私は、Pythonでpandasを使用してデータフレームに必要なデータを整理しておくのに問題があります。Pythonでpandasを使用して複数のデータセットのデータを同じデータフレームに整理するにはどうすればよいですか?

私は、データが3列(例えば、TimeVおよびI)で構成される単一のデータフレームを持っていたいと思います。

しかし、同じデータフレームに異なるサンプルのデータを入れて、Sample#1またはSample#2のデータを簡単に選択できるようにしたいと思います。私はそのデータがどのサンプルに対応を追跡するためにSampleと呼ばれる別の列を追加

df1 = pd.DataFrame({'Time': np.arange(0,10,0.5), 'V': np.random.rand(20), 'I': np.random.rand(20)}) 
df1['Sample']= 'sample_1' 

df2 = pd.DataFrame({'Time': np.arange(0,10,0.5), 'V': np.random.rand(20), 'I': np.random.rand(20)}) 
df2['Sample']= 'sample_2' 

df = df1.append(df2) 

お知らせ:私は思いついた何

はこのようなものでした。

しかし、その後、私は私がこれをどのように操作を行うことができDF

からsample_1またはsample_2からデータを呼び出す方法がわからないと、これは私のデータを整理するための正しい方法ですか? MultiIndexを使用する必要がありますか?

+0

をあなたのオプションを使用してからcサンプルを 'df.loc [df [" Sample "] ==" sample_1 "、:]'で置き換えてください。より標準的でクリーンなデータが重要です(http://vita.had.co.nz/papers/tidy-data.pdf)。 – Javier

答えて

1

はい、MultiIndexは一つの可能​​な解決策である:

np.random.seed(1) 
df1 = pd.DataFrame({'Time': np.arange(0,10,0.5), 
        'V': np.random.rand(20), 
        'I': np.random.rand(20)}) 

np.random.seed(2) 
df2 = pd.DataFrame({'Time': np.arange(0,10,0.5), 
        'V': np.random.rand(20), 
        'I': np.random.rand(20)}) 

#print (df1) 
#print (df2) 

あなたはconcatすべてDataFrameの1へとパラメータkeysの各ソースDataFrameを指定することができます。

print (pd.concat([df1, df2], keys=('sample_1','sample_2'))) 
        I Time   V 
sample_1 0 0.800745 0.0 0.417022 
     1 0.968262 0.5 0.720324 
     2 0.313424 1.0 0.000114 
     3 0.692323 1.5 0.302333 
     4 0.876389 2.0 0.146756 
     5 0.894607 2.5 0.092339 
     6 0.085044 3.0 0.186260 
     7 0.039055 3.5 0.345561 
     8 0.169830 4.0 0.396767 
     9 0.878143 4.5 0.538817 
     10 0.098347 5.0 0.419195 
     11 0.421108 5.5 0.685220 
     12 0.957890 6.0 0.204452 
     13 0.533165 6.5 0.878117 
     14 0.691877 7.0 0.027388 
     15 0.315516 7.5 0.670468 
     16 0.686501 8.0 0.417305 
     17 0.834626 8.5 0.558690 
     18 0.018288 9.0 0.140387 
     19 0.750144 9.5 0.198101 
sample_2 0 0.505246 0.0 0.435995 
     1 0.065287 0.5 0.025926 
     2 0.428122 1.0 0.549662 
     3 0.096531 1.5 0.435322 
     4 0.127160 2.0 0.420368 
     5 0.596745 2.5 0.330335 
     6 0.226012 3.0 0.204649 
     7 0.106946 3.5 0.619271 
     8 0.220306 4.0 0.299655 
     9 0.349826 4.5 0.266827 
     10 0.467787 5.0 0.621134 
     11 0.201743 5.5 0.529142 
     12 0.640407 6.0 0.134580 
     13 0.483070 6.5 0.513578 
     14 0.505237 7.0 0.184440 
     15 0.386893 7.5 0.785335 
     16 0.793637 8.0 0.853975 
     17 0.580004 8.5 0.494237 
     18 0.162299 9.0 0.846561 
     19 0.700752 9.5 0.079645 

選択データはxsすることにより可能です - cross section

print (df.xs('sample_1', level=0)) 
      I Time   V 
0 0.800745 0.0 0.417022 
1 0.968262 0.5 0.720324 
2 0.313424 1.0 0.000114 
3 0.692323 1.5 0.302333 
4 0.876389 2.0 0.146756 
5 0.894607 2.5 0.092339 
6 0.085044 3.0 0.186260 
7 0.039055 3.5 0.345561 
8 0.169830 4.0 0.396767 
9 0.878143 4.5 0.538817 
10 0.098347 5.0 0.419195 
11 0.421108 5.5 0.685220 
12 0.957890 6.0 0.204452 
13 0.533165 6.5 0.878117 
14 0.691877 7.0 0.027388 
15 0.315516 7.5 0.670468 
16 0.686501 8.0 0.417305 
17 0.834626 8.5 0.558690 
18 0.018288 9.0 0.140387 
19 0.750144 9.5 0.198101 

一部のカラムだけを選択が必要な場合:

print (df.xs('sample_1', level=0)[['Time','I']]) 
    Time   I 
0 0.0 0.800745 
1 0.5 0.968262 
2 1.0 0.313424 
3 1.5 0.692323 
4 2.0 0.876389 
5 2.5 0.894607 
6 3.0 0.085044 
7 3.5 0.039055 
8 4.0 0.169830 
9 4.5 0.878143 
10 5.0 0.098347 
11 5.5 0.421108 
12 6.0 0.957890 
13 6.5 0.533165 
14 7.0 0.691877 
15 7.5 0.315516 
16 8.0 0.686501 
17 8.5 0.834626 
18 9.0 0.018288 
19 9.5 0.750144 

別の解決策は、IndexSliceを使用している - Multiindexの最初のレベルを取り外す必要がある場合はusing slicers

idx = pd.IndexSlice 
print (df.loc[idx['sample_1',:], ['Time','I']]) 
      Time   I 
sample_1 0 0.0 0.800745 
     1 0.5 0.968262 
     2 1.0 0.313424 
     3 1.5 0.692323 
     4 2.0 0.876389 
     5 2.5 0.894607 
     6 3.0 0.085044 
     7 3.5 0.039055 
     8 4.0 0.169830 
     9 4.5 0.878143 
     10 5.0 0.098347 
     11 5.5 0.421108 
     12 6.0 0.957890 
     13 6.5 0.533165 
     14 7.0 0.691877 
     15 7.5 0.315516 
     16 8.0 0.686501 
     17 8.5 0.834626 
     18 9.0 0.018288 
     19 9.5 0.750144 

を参照してください。私は

idx = pd.IndexSlice 
print (df.loc[idx['sample_1',:], ['Time','I']].reset_index(level=0, drop=True)) 
    Time   I 
0 0.0 0.800745 
1 0.5 0.968262 
2 1.0 0.313424 
3 1.5 0.692323 
4 2.0 0.876389 
5 2.5 0.894607 
6 3.0 0.085044 
7 3.5 0.039055 
8 4.0 0.169830 
9 4.5 0.878143 
10 5.0 0.098347 
11 5.5 0.421108 
12 6.0 0.957890 
13 6.5 0.533165 
14 7.0 0.691877 
15 7.5 0.315516 
16 8.0 0.686501 
17 8.5 0.834626 
18 9.0 0.018288 
19 9.5 0.750144 
+0

ありがとうございます。私はこれがまさに私が探していたものだと思う。しかし、データフレームを新しい 'df'に連結することを考慮して、たとえば、 'Time'と 'I'という列をsample_1からのみ印刷することはできますか? – cinico

+0

お受け取りいただきありがとうございます。私はあなたに尋ねたい。私に秒を与える、私はそれを答えに加える。 – jezrael

+0

編集をご覧ください。 – jezrael

関連する問題