2016-04-14 4 views
1

私はこのようになり、データ再構築しようとしている:私はsns.tsplotにそれを養うことができるように複数の時系列信号をsns.tsplotで使用するために再構成する方法は?

t trial signal value 
0 0 0  y  -1 
1 0 1  y  0 
2 0 2  y  1 
3 1 0  y  0 
4 1 1  y  1 
5 1 2  y  2 
6 2 0  y  1 
7 2 1  y  2 
8 2 2  y  3 
9 3 0  y  2 
10 3 1  y  3 
11 3 2  y  4 
12 4 0  y  3 
13 4 1  y  4 
14 4 2  y  5 

:このような何かに

t y0 y1 y2 
0 0 -1 0 1 
1 1 0 1 2 
2 2 1 2 3 
3 3 2 3 4 
4 4 3 4 5 

を。

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import seaborn as sns 

fig = plt.figure() 
num_points = 5 

# Create some dummy line signals and assemble a data frame 
t = np.arange(num_points) 
y0 = t - 1 
y1 = t 
y2 = t + 1 
df = pd.DataFrame(np.vstack((t, y0, y1, y2)).transpose(), columns=['t', 'y0', 'y1', 'y2']) 
print(df) 

# Do some magic transformations 
df = pd.melt(df, id_vars=['t']) 
print(df) 

# Plot the time-series data 
sns.tsplot(time="t", value="value", unit="trial", condition="signal", data=df, ci=[68, 95]) 

plt.savefig("dummy.png") 
plt.close() 

私はラインのためにこれを達成するために願っています:

enter image description here

https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.tsplot.html http://pandas.pydata.org/pandas-docs/stable/reshaping.html

答えて

1

私はあなたが再形成のためmeltを使用することができると思う、indexing with strによって、第1および第2の文字を取得し、最後のsort_values並び替え列:

df1 = pd.melt(df, id_vars=['t']) 
#create helper Series 
variable = df1['variable'] 
#extract second char, convert to int 
df1['trial'] = variable.str[1].astype(int) 
#extract first char 
df1['signal'] = variable.str[0] 
#sort values by column t, reset index 
df1 = df1.sort_values('t').reset_index(drop=True) 
#reorder columns 
df1 = df1[['t','trial','signal','value']] 
print df1 
    t trial signal value 
0 0  0  y  -1 
1 0  1  y  0 
2 0  2  y  1 
3 1  0  y  0 
4 1  1  y  1 
5 1  2  y  2 
6 2  0  y  1 
7 2  1  y  2 
8 2  2  y  3 
9 3  0  y  2 
10 3  1  y  3 
11 3  2  y  4 
12 4  0  y  3 
13 4  1  y  4 
14 4  2  y  5 

別の解決策は、列signal内のすべての値が唯一のyある場合:

#remove y from column name, first value of column names is same 
df.columns = df.columns[:1].tolist() + [int(col[1]) for col in df.columns[1:]] 
print df 
    t 0 1 2 
0 0 -1 0 1 
1 1 0 1 2 
2 2 1 2 3 
3 3 2 3 4 
4 4 3 4 5 

df1 = pd.melt(df, id_vars=['t'], var_name=['trial']) 
#all values in column signal are y 
df1['signal'] = 't' 
#sort values by column t, reset index 
df1 = df1.sort_values('t').reset_index(drop=True) 
#reorder columns 
df1 = df1[['t','trial','signal','value']] 
print df1 
    t trial signal value 
0 0  0  t  -1 
1 0  1  t  0 
2 0  2  t  1 
3 1  0  t  0 
4 1  1  t  1 
5 1  2  t  2 
6 2  0  t  1 
7 2  1  t  2 
8 2  2  t  3 
9 3  0  t  2 
10 3  1  t  3 
11 3  2  t  4 
12 4  0  t  3 
13 4  1  t  4 
14 4  2  t  5 
+0

OMG、あなたはSO速いと答えました!これは機能しますが、より簡単な変換はありませんか?私はこれが非常に一般的な使用法でなければならないように感じる。 – tarabyte

+0

私はここで '融解'は最良の選択だと思います。しかし、あなたは 'print df.set_index( 't')のようなものを' melt'の代わりに使用することができます。 '' reset_index(name = 'value')。rename(columns = {'level_1': 'variable'}) '、それはより複雑です。 – jezrael

+0

これは任意の数の試行に比例していないようです – tarabyte

関連する問題