在pandas中,我试图弄清楚如何使用相同的键对行进行分组,在一行中有一组包含组中的键(由id分组),一组不常见的功能的常用功能.
就像是
id C1 C2 Uk U1 0 x 1 2 3 4 1 y 5 6 7 8 2 x 1 2 9 10 3 y 5 6 3 11
这里的共同特征集是C1和C2,一组不常见的特征是Uk和U1,其中组的密钥是Uk.
在此示例中,所需的结果是:
id C1 C2 Uk3_U1 Uk7_U1 Uk9_U1 0 x 1 2 4 NaN 10.0 1 y 5 6 11 8.0 NaN
当然,它们可能是一个U2列(嗨Bono!),但这使得示例更难写,因为结果中的列数会更大.
生成此数据集的代码是:
pd.DataFrame({'id': ['x', 'y', 'x', 'y'],
'C1': [1, 5, 1, 5], 'C2': [2, 6, 2, 6],
'Uk': [3, 7, 9, 3], 'U1': [4, 8, 10, 11]})
谢谢.
最佳答案 枢轴连接
您可以使用pivot
轻松完成此操作,并使用join
与原始df结合使用:
new_df = new_df = df.pivot('id','Uk', 'U1')
.add_prefix('Uk').add_suffix('_U1').reset_index()
print(new_df)
Uk id Uk3_U1 Uk7_U1 Uk9_U1
0 x 4.0 NaN 10.0
1 y 11.0 8.0 NaN
new_df.join(df.loc[:,'C1':'C2'])
id Uk3 Uk7 Uk9 C1 C2
0 x 4.0 NaN 10.0 1 2
1 y 11.0 8.0 NaN 5 6
在更一般的情况下,您想要转动多个列[C1 … Cn],您可以执行以下操作.比如你有以下df:
id C1 C2 Uk U1 U2
0 x 1 2 3 4 5
1 y 5 6 7 8 2
2 x 1 2 9 10 10
3 y 5 6 3 11 11
你可以这样做:
values_to_pivot = df.columns.difference(['id', 'C1', 'C2', 'Uk'])
new_df = df.pivot('id','Uk', values_to_pivot).reset_index()
print(new_df)
id U1 U2
Uk 3 7 9 3 7 9
0 x 4.0 NaN 10.0 5.0 NaN 10.0
1 y 11.0 8.0 NaN 11.0 2.0 NaN
new_df.join(df.loc[:,'C1':'C2'])
(id, ) (U1, 3) (U1, 7) (U1, 9) (U2, 3) (U2, 7) (U2, 9) C1 C2
0 x 4.0 NaN 10.0 5.0 NaN 10.0 1 2
1 y 11.0 8.0 NaN 11.0 2.0 NaN 5 6