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