我想将数据框列转换为行
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列的值。
我尝试使用数据透视表进行操作,然后创建了多索引数据框,并且我也无法左右移动。因此请帮助我解决此问题。
答案 0 :(得分:2)
如果熊猫为0.24+,请先将Series.shift
与fill_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)
让我知道这是否有帮助!