如何将pandas df的多列转换为多行,如下所示? 我想为一个非常大的df这样做,所以我正在寻找一种相对快速的方法。
current df:
LOG_TIME QP_HCP IP_HCP QP_PRP IP_PRP
0 68444.0 4.9 0.6 4.8 3.8
df I want to obtain:
LOG_TIME ORIENTATION QP IP
0 68444.0 HCP 4.9 0.6
1 68444.0 PRP 4.8 3.8
答案 0 :(得分:4)
首先,重塑您的DataFrame,使您拥有以下格式。
LOG_TIME ORIENTATION value result
0 68444.0 PRP 4.8 QP
1 68444.0 HCP 4.9 QP
2 68444.0 PRP 3.8 IP
3 68444.0 HCP 0.6 IP
您可以使用以下方法执行此操作。
new = df.melt(id_vars='LOG_TIME', value_vars=['QP_PRP', 'QP_HCP', 'IP_PRP', 'IP_HCP'], var_name='ORIENTATION')
new[['result', 'ORIENTATION']] = new['ORIENTATION'].str.split('_', expand=True).rename(columns={0: 'result', 1: 'ORIENTATION'})
然后你可以转动数据。
new = new.pivot_table(index=['LOG_TIME', 'ORIENTATION'], columns='result', values='value')
pd.DataFrame(new.to_records())
Out[6]:
LOG_TIME ORIENTATION IP QP
0 68444.0 HCP 0.6 4.9
1 68444.0 PRP 3.8 4.8
答案 1 :(得分:0)
hcp_df = df[['LOG_TIME', 'QP_HCP', 'IP_HCP' ]].values
prp_df = df[['LOG_TIME', 'QP_PRP', 'IP_PRP']].values
df2 = pd.DataFrame(prp_df, columns=['LOG_TIME', 'QP', 'IP'], index=['PRP'] *prp_df.shape[0])
df1 = pd.DataFrame(hcp_df, columns=['LOG_TIME', 'QP', 'IP'], index=['HCP'] * hcp_df.shape[0])
df1.append(df2).reset_index().rename({'index': 'ORIENTATION'}, axis=1)
以下代码在我身边起作用: 这就是我所做的:
所需的输出在这里:
ORIENTATION LOG_TIME QP IP
0 HCP 68444.0 4.9 0.6
1 PRP 68444.0 4.8 3.8