如何重新配置​​ pandas 数据框?

How to reconfigure a pandas dataframe?

我正在尝试重新配置 pandas 数据框,目前看起来像这样:

   A   B   C   D   E   F
0  7   5   2   1   2   2
1  3   4   3   1   4   6
2  1   3   2   6   5   5

变成这样的东西:

   c1  c2  c3  
0  7   5   2
0  1   2   2
1  3   4   3
1  1   4   6
2  1   3   2   
2  6   5   5

(尝试拆分数据框,然后将后一个切片作为新行放在下面 - c1、c2、c3 是新的列标签)

我相信这里有必要将值重塑为 3 列,唯一必要的列长度模数是 0:

print (len(df.columns) % 3)
0

df = pd.DataFrame(df.values.reshape(-1, 3), 
                  columns=[f'c{x}' for x in range(1, 4)], 
                  index = np.repeat(df.index, len(df.columns) / 3))
print (df)

   c1  c2  c3
0   7   5   2
0   1   2   2
1   3   4   3
1   1   4   6
2   1   3   2
2   6   5   5

编辑:

我尝试模拟您的问题 - 添加了新列 G 并在 3 列中获得输出:

print (df)
   A  B  C  D  E  F   G
0  7  5  2  1  2  2  10
1  3  4  3  1  4  6  20
2  1  3  2  6  5  5  30

如果需要输出中的所有值,则添加来自末尾的值 NaNs,因为不存在:

N = 3
c = np.arange(len(df.columns))
df.columns = [c % N, c // N]

df = df.stack().reset_index(drop=True)
df.columns = [f'{x + 1}' for x in df.columns]
print (df)
    1    2    3
0   7  5.0  2.0
1   1  2.0  2.0
2  10  NaN  NaN
3   3  4.0  3.0
4   1  4.0  6.0
5  20  NaN  NaN
6   1  3.0  2.0
7   6  5.0  5.0
8  30  NaN  NaN

另一个想法是删除通过索引创建 NaN 的列 - 这里是列 G:

N = 3
c = len(df.columns)
last = (c % N)

df = df.iloc[:, :-last]
print (df)
   A  B  C  D  E  F
0  7  5  2  1  2  2
1  3  4  3  1  4  6
2  1  3  2  6  5  5

然后使用原方案:

df = pd.DataFrame(df.values.reshape(-1, 3), 
                  columns=[f'c{x}' for x in range(1, 4)], 
                  index = np.repeat(df.index, len(df.columns) / 3))
print (df)
   c1  c2  c3
0   7   5   2
0   1   2   2
1   3   4   3
1   1   4   6
2   1   3   2
2   6   5   5

如果列数可以被 3 整除并且您想要唯一的索引名称:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [7.0, 3.0, 1.0],
          'B': [5.0, 4.0, 3.0],
          'C': [2.0, 3.0, 2.0],
          'D': [1.0, 1.0, 6.0],
          'E': [2.0, 4.0, 5.0],
          'F': [2.0, 6.0, 5.0]})

df1 = pd.DataFrame(df.to_numpy().reshape(-1,3), columns = ['c1','c2','c3'])

print(df1)

    c1   c2   c3
0  7.0  5.0  2.0
1  1.0  2.0  2.0
2  3.0  4.0  3.0
3  1.0  4.0  6.0
4  1.0  3.0  2.0
5  6.0  5.0  5.0