熊猫:将具有相同键的行分组为一行

时间:2018-11-28 16:03:12

标签: python 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

此处,常见特征集为C1C2,不常见特征集为UkU1,组的键为{{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

谢谢。

3 个答案:

答案 0 :(得分:3)

pd.pivot_table

您可以用index指定columnspd.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