首页 > 解决方案 > 如何将宽数据帧转换为长数据帧

问题描述

我正在尝试将宽数据帧 [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

我知道必须有一种更优雅的方式来做到这一点。谢谢你的帮助,

标签: pythonpandasdataframenumpyappend

解决方案


如果你不喜欢熊猫,我会做这样的事情:

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 数组设置回数据帧。


推荐阅读