如何重新配置​​熊猫数据框?

时间:2019-05-17 13:24:46

标签: python pandas dataframe subset data-munging

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

   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是新的列标签)

2 个答案:

答案 0 :(得分:2)

我相信这里是将必要的整形值调整为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

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

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

答案 1 :(得分:0)

如果列数可被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