我有这个数据框:
pd.DataFrame({"X": [1,2,3,4],
"Y": [5,6,7,8],
"Z": [9,10,11,12]})
我正在寻找此输出:
目前,我发现解决的类似问题是相反的:从系列到数据框。我发现最相似的是this one,这一点都不相似。我也尝试过使用pivot_table()
和reshape()
,但是它们需要一个索引列,而我只是在寻找一个列。
有什么建议吗?
PS:您可以假定数据帧有100列以避免避免一一选择,但是您可以按顺序调用它们(例如,如果它们是100列,则可以执行X1:X100
)
答案 0 :(得分:7)
对ravel('F')
使用展平-
In [14]: pd.Series(df.to_numpy(copy=False).ravel('F'))
Out[14]:
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
dtype: int64
该系列是对输入数据框的视图,这实际上意味着免费的运行时和零内存开销。让我们验证一下-
In [20]: s = pd.Series(df.to_numpy(copy=False).ravel('F'))
In [21]: np.shares_memory(s,df)
Out[21]: True
让我们也确认时间-
In [2]: df = pd.DataFrame(np.random.rand(100000,3), columns=['X','Y','Z'])
In [3]: %timeit pd.Series(df.to_numpy(copy=False).ravel('F'))
579 µs ± 9.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
答案 1 :(得分:5)
这是melt
:
df.melt()[['value']]
输出:
value
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
答案 2 :(得分:4)
一种方法是通过堆叠将数据从“宽”格式整形为“高”格式:
df.T.stack().reset_index(drop=True)
#0 1
#1 2
#2 3
#3 4
#4 5
#5 6
#6 7
#7 8
#8 9
#9 10
#10 11
#11 12
答案 3 :(得分:0)
一如既往,在熊猫中有很多“皮猫”的方法,然后性能可能成为标准。这是一个元答案,用于比较效果:
ravel
,来自Divakar:80美元stack
:640美元melt
:2.03毫秒