Python 从数据帧堆叠时命名熊猫系列

Python 从数据帧堆叠时命名熊猫系列,python,pandas,Python,Pandas,我在pandas中的一个常见工作流程是从一些“宽”形式的数值函数中获取数据,并将其转换为用于绘图和统计建模的“长”形式的数据框架 我所说的宽格式是指在列中有可变的信息编码。例如,假设我在10个不同的受试者的5个时间点上测量了一些值: wide_df = pd.DataFrame(np.random.randn(10, 5), index=pd.Series(list("abcdefghij"), name="subject"),

我在pandas中的一个常见工作流程是从一些“宽”形式的数值函数中获取数据,并将其转换为用于绘图和统计建模的“长”形式的数据框架

我所说的宽格式是指在列中有可变的信息编码。例如,假设我在10个不同的受试者的5个时间点上测量了一些值:

wide_df = pd.DataFrame(np.random.randn(10, 5),
                       index=pd.Series(list("abcdefghij"), name="subject"),
                       columns=pd.Series(np.arange(5) * 2, name="timepoint"))
print wide_df


timepoint         0         2         4         6         8
subject                                                    
a         -0.670881  0.959608 -0.480081  0.142092  1.697058
b          2.369493 -0.561081 -0.183635 -0.807523 -0.421347
c         -0.908420  0.629171  0.196728 -0.907443  0.264352
d         -0.390138 -1.821304 -1.994605  0.225164  0.187649
e         -0.860542 -0.998323 -0.490968 -0.815570 -1.009524
f         -0.917390 -0.120567 -0.893095 -0.359155 -0.204112
g          0.557500 -1.522631 -1.175746  0.705043 -0.366932
h         -0.817043  2.204493 -0.305202  0.464969  0.280027
i         -1.137253  0.350984  0.095577  0.468167 -0.058058
j         -0.569986  2.438580 -0.514894  0.860504  1.397393

[10 rows x 5 columns]
我所知道的将此内容整理成长格式数据帧的最快方法是使用
stack
,然后使用
reset\u index

long_df = wide_df.stack().reset_index()
print long_df.head()

 subject  timepoint         0
0       a          0 -0.670881
1       a          2  0.959608
2       a          4 -0.480081
3       a          6  0.142092
4       a          8  1.697058

[5 rows x 3 columns]

问题是我的“值”列现在命名为
0
。我可以

long_series = wide_df.stack()
long_series.name = "value"
long_df = long_series.reset_index()
但这需要更多的类型化,需要命名一个中间变量,并将方法调用与属性赋值混合在一起,从而真正打破了我的流程

有没有一种方法可以在一行中完成?我想,
df.stack
可能需要一个
name
参数,但它没有,而且
Series
对象似乎没有我能找到的
set\u name
方法


我确实知道pandas.melt,但在这种“纯”宽表数据的情况下,这似乎有些过分,它删除了重要的
主题
索引。这里还有其他答案吗?

正是因为这个原因,他们的是Series.reset\u索引的
name
参数

In [14]: wide_df.stack().reset_index(name='foo')
Out[14]: 
   subject  timepoint       foo
0        a          0 -0.179968
1        a          2  1.559283
2        a          4  1.020142
3        a          6 -0.899663
4        a          8  2.983990
5        b          0  0.586476
6        b          2  0.055108
7        b          4  1.834005
8        b          6  1.226371
9        b          8  0.953103
10       c          0 -0.919273
如果您愿意,您也可以定义它(这将是对DataFrame的一个很好的添加):


正是由于这个原因,它们是Series.reset\u索引的
名称
参数

In [14]: wide_df.stack().reset_index(name='foo')
Out[14]: 
   subject  timepoint       foo
0        a          0 -0.179968
1        a          2  1.559283
2        a          4  1.020142
3        a          6 -0.899663
4        a          8  2.983990
5        b          0  0.586476
6        b          2  0.055108
7        b          4  1.834005
8        b          6  1.226371
9        b          8  0.953103
10       c          0 -0.919273
如果您愿意,您也可以定义它(这将是对DataFrame的一个很好的添加):


也许我真正的问题是“为什么
melt
不是一个数据帧方法?这很有效:
pd.melt(wide\u df.reset\u index(),“subject”)
,但感觉作为链式方法调用读取会更容易,可以按线性顺序读取。不确定为什么它们不是数据帧上的
melt
,可以/应该是。也许我真正的问题是“为什么
melt
不是数据帧方法?”?这非常有效:
pd.melt(wide\u df.reset\u index(),“subject”)
,但感觉它更容易作为链式方法调用读取,可以按线性顺序读取。不确定为什么它们在数据帧上不是
melt
,可以/应该是。