如何将宽数据帧转换为长数据帧
Posted
技术标签:
【中文标题】如何将宽数据帧转换为长数据帧【英文标题】:How to convert wide dataframe to long dataframe 【发布时间】:2021-12-21 19:10:53 【问题描述】:我正在尝试将宽数据帧 [2r, 12c] 转换为长数据帧 [4r,6c)。
From this ...
0 1 2 3 4 5 6 7 8 9 10 11
0 1.0 0.9 0.8 0.5 0.4 0.3 0.7 0.9 0.2 0.1 0.4 0.3
1 0.6 0.8 0.5 0.3 0.7 0.1 0.4 0.2 0.8 0.6 0.4 0.1
... to this ...
0 1 2 3 4 5
0 1.0 0.9 0.8 0.5 0.4 0.3
1 0.7 0.9 0.2 0.1 0.4 0.3
2 0.6 0.8 0.5 0.3 0.7 0.1
3 0.4 0.2 0.8 0.6 0.4 0.1
我的代码产生了意想不到的结果:
0 1 2 3 4 5 6 7 8 9 10 11
0 1.0 0.9 0.8 0.5 0.4 0.3
1 Nan Nan Nan Nan Nan Nan 0.7 0.9 0.2 0.1 0.4 0.3
etc...
我的代码:
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(2, 12)
)
slice_sz = 6
x = df.columns
col_num = len(x)
col_iter = int(col_num / slice_sz)
y = df.index
row_num = len(y)
df_list = pd.DataFrame([])
for row in range(row_num):
# print('Processing row', row)
i = 0
j = slice_sz - 1
for col in range(col_iter):
df_sliced = df.iloc[row, i:j]
df_sliced = df_sliced.to_frame()
df_sliced = df_sliced.transpose()
df_list = df_list.append(df_sliced)
df_sliced = []
i += slice_sz
j += slice_sz
我知道必须有更优雅的方式来做到这一点。 感谢您的帮助,
【问题讨论】:
【参考方案1】:对于上面的代码,我会使用df_list.pivot()
在.pivot()
中,您需要指定index = ''
、columns = ''
和values = ''
。如果您需要进一步说明,请在 .pivot()
上提供大量信息。
此功能将有助于数据帧的宽到长或长到宽转置。
这应该消除您为执行此任务而放在一起的 for 循环。
【讨论】:
我查看了 .pivot() 和 .melt() (以及 .wide_to_long() ),但不知道如何使用它们。我会再看看这些。谢谢! 没有汗水。如果答案是好的,请投上一票。【参考方案2】:如果你不喜欢熊猫,我会这样做:
import numpy as np
data = np.random.randn(2, 12)
# reshape is your friend!
data_transformed = data.reshape(4,6)
请在此处查看numpy.reshape
文档:https://numpy.org/doc/stable/reference/generated/numpy.reshape.html
虽然如果你真的、真的、真的想重塑数据框(虽然我不确定你为什么要这样做),你可以这样做:
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randn(2, 12)
)
df = pd.DataFrame(df.to_numpy().reshape(4,6))
我实际上所做的就是将数据帧转换为 numpy 数组,重新整形,然后将 numpy 数组设置回数据帧。
【讨论】:
那一行代码与随机浮点数完美配合,但我注意到您在 reshape 行中使用了 .to_numpy() 。如果它有混合类型怎么办?我现在将研究 .reshape 。谢谢! 我已经测试了重塑方法 ``` df = pd.DataFrame(df.to_numpy().reshape(4,6)) ``` 它似乎对所有数据类型都有效.所以任务完成了。谢谢你 Ryno_XLI! 很高兴听到,reshape 非常有用,我经常使用它。如果你用谷歌搜索“numpy reshape”,你应该会找到很好的资源。例如,.reshape(-1,6)
和 .reshape(4,-1)
将与 .reshape(4,6)
完全相同,因为原始形状是 (2,12)。重塑只是推断“-1”值需要的行数,如果你给它一个 6 作为列数(反之亦然,对于 (4,-1) 的输入)。以上是关于如何将宽数据帧转换为长数据帧的主要内容,如果未能解决你的问题,请参考以下文章