Python 如何重塑多个时间序列信号以用于sns.tsplot?

Python 如何重塑多个时间序列信号以用于sns.tsplot?,python,numpy,pandas,reshape,seaborn,Python,Numpy,Pandas,Reshape,Seaborn,我正在尝试重新塑造如下所示的数据: 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 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

我正在尝试重新塑造如下所示的数据:

   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
    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
    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
这样我就可以把它输入
sns.tsplot

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()
我希望在以下几行中实现这一点:

我认为您可以使用以下方法进行重塑:通过重新排序列获取第一个和第二个字符,以及最后一个字符:

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
另一种解决方案是,如果列
信号
中的所有值仅为
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

天哪,你回答得太快了!这是可行的,但是没有更简单的转换吗?我觉得这应该是一个非常普遍的用法。我认为
melt
这里是最好的选择。但是您可以使用
melt
类似于
print df.set_index('t').stack().reset_index(name='value').rename(columns={'level_1':'variable'})
,但它更复杂。这似乎无法扩展到任何数量的试验。您能解释更多吗?