将行重塑为数据框的列

时间:2020-02-09 15:31:39

标签: python pandas dataframe

我想将数据框列转换为行

A   B   C  D  E   F
--------------------
1   a   x  11  k  9
2   b   y  22  j  10
3   c   z  33  h  11
4   d   p  44  g  12
5   e   q  55  f  13

在上面的示例数据框中,我想转换为

B   D   E   1  2  3  4  5   M1  M2   M3   M4  M5
-------------------------------------------------
a  11   k   x   y  z  p  q  9   10   11   12  13
b  12   j   y  z  p  q      9   10   11   12  13
c  13   h   z  p  q         9   10   11   12  13
d  14   g   p  q            9   10   11   12  13
e  15   f   q               9   10   11   12  13

在这里,我首先将A列的转换为新数据帧的标题(即新数据帧中的1,2,3,4,5)。然后我将C列中的值放在header(1,2,3,4,5)中的value中,然后在数据中创建一个新列(M1,M2,M3,M4,M5)并填充Value新DataFarme的每一列中F列的值。

我尝试使用数据透视表进行操作,然后创建了多索引数据框,并且我也无法左右移动。因此请帮助我解决此问题。

New Data Frame image

2 个答案:

答案 0 :(得分:2)

如果熊猫为0.24+,请先将Series.shiftfill_value一起使用,然后通过F列和DataFrame.join创建新的DataFrame:

for i, x in enumerate(df.C):
    df[i+1] = df.C.shift(-i, fill_value='')
    #pandas below
    #df[i+1] = df.C.shift(-i).fillna('') 

df1 = pd.DataFrame([df.pop('F').tolist()], 
                    index=df.index, 
                    columns=[f'M{x+1}' for x in range(len(df))])
df = df.drop('C', axis=1).join(df1)
print (df)
   A  B   D  E  1  2  3  4  5  M1  M2  M3  M4  M5
0  1  a  11  k  x  y  z  p  q   9  10  11  12  13
1  2  b  22  j  y  z  p  q      9  10  11  12  13
2  3  c  33  h  z  p  q         9  10  11  12  13
3  4  d  44  g  p  q            9  10  11  12  13
4  5  e  55  f  q               9  10  11  12  13

答案 1 :(得分:0)

这不是花哨的-但我认为它可行!

bde_df = df[['B', 'D', 'E']].copy()

c_df = df['C'].transpose(copy=True)
c_df = c_df.append([c_df]*4, ignore_index=True)
c_df = c_df.apply(lambda x: x.shift(-1, axis=0))

bde_df[[1, 2, 3, 4, 5]] = c_df[[1, 2, 3, 4, 5]]

f_df = df['F'].transpose(copy=True)
f_df = f_df.append([f_df]*4, ignore_index=True)
f_df.rename(columns={1: 'M1', 2: 'M2', 3: 'M3', 4: 'M4', 5: 'M5'})
bde_df[['M1', 'M2', 'M3', 'M4', 'M5']] = f_df[['M1', 'M2', 'M3', 'M4', 'M5']]

print(bde_df)

让我知道这是否有帮助!