在熊猫中,我试图弄清楚如何使用相同的键对行进行分组,在一组中具有一组包含一组键的通用功能(按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
,组的键为{{1} }。
在此示例中,期望的结果是:
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
当然,它们本可以是Uk
列(嗨,Bono!),但这使示例更难编写,因为结果中的列数会更大。
用于生成此数据集的代码为:
U2
谢谢。
答案 0 :(得分:3)
pd.pivot_table
您可以用index
指定columns
和pd.pivot_table
:
# add string prefix to Uk series
df['Uk'] = 'Uk' + df['Uk'].astype(str)
# pivot data and add suffix to columns
res = pd.pivot_table(df, index=['id', 'C1', 'C2'], columns='Uk')\
.add_suffix('_U1').reset_index()
# flatten MultiIndex columns
res.columns = [j or i for i, j in res.columns.values]
print(res)
id C1 C2 Uk3_U1 Uk7_U1 Uk9_U1
0 x 1 2 4.0 NaN 10.0
1 y 5 6 11.0 8.0 NaN
答案 1 :(得分:2)
IIUC
df.set_index(['id','C1','C2','Uk']).U1.unstack().add_prefix('Uk').add_suffix('_U1')
Out[223]:
Uk Uk3_U1 Uk7_U1 Uk9_U1
id C1 C2
x 1 2 4.0 NaN 10.0
y 5 6 11.0 8.0 NaN
要匹配您的预期输出,但不建议
df.set_index(['id','C1','C2','Uk']).U1.unstack().add_prefix('Uk').add_suffix('_U1').reset_index()
更新
newdf=df.set_index(['id','C1','C2','Uk']).unstack()
newdf.columns=newdf.columns.map('Uk{0[1]}_{0[0]}'.format)
newdf
Out[236]:
Uk3_U1 Uk7_U1 Uk9_U1 Uk3_U2 Uk7_U2 Uk9_U2
id C1 C2
x 1 2 4.0 NaN 10.0 4.0 NaN 10.0
y 5 6 11.0 8.0 NaN 11.0 8.0 NaN
答案 2 :(得分:1)
pivot
+ join
您可以轻松地通过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