如何将宽数据帧转换为长数据帧

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) 的输入)。

以上是关于如何将宽数据帧转换为长数据帧的主要内容,如果未能解决你的问题,请参考以下文章

通过多个步骤将宽数据集转换为长数据集

将宽格式转换为长格式,然后嵌套列

使用 INNER JOIN LATERAL 和 postgresql 将宽表转换为长表

如何将空间数据帧转换回普通数据帧?

如何将数据帧切片转换为新数据帧

Databricks:如何将 %python 下的 Spark 数据帧转换为 %r 下的数据帧