如何将宽格式数据框转换为长格式数据框

3
我试图将一个宽的数据框[2行,12列]转换成一个长的数据框[4行,6列]。
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

我知道一定有更简洁的方法来完成这个问题。

感谢你的帮助。

2个回答

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。谢谢! - doing_the_best_I_can
我已经测试了reshape方法df = pd.DataFrame(df.to_numpy().reshape(4,6))它似乎对所有数据类型都有效。任务完成。 谢谢Ryno_XLI! - doing_the_best_I_can
1
很高兴听到,reshape非常有用,我经常使用它。如果你在谷歌上搜索“numpy reshape”,你应该能找到很好的资源。例如,.reshape(-1,6).reshape(4,-1).reshape(4,6)完全相同,因为原始形状是(2,12)。Reshape只是推断出“-1”值所需的行数,如果你给它一个6作为列数(对于(4,-1)的输入也是如此)。 - Ryno_XLI

0

对于上面的代码,我会使用df_list.pivot()

.pivot()中,您需要指定index = ''columns = ''values = ''。如果您需要进一步澄清,.pivot()周围有大量信息可供参考。

此函数将帮助您对数据框进行宽到长或长到宽的转置。

这将消除您为完成此任务而组合的for循环。


我查看了 .pivot() 和 .melt()(以及 .wide_to_long()),但是无法弄清如何使用它们。我会再次查看这些内容。谢谢! - doing_the_best_I_can
没问题。如果答案可以的话,请点个赞。 - 7royboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接