熊猫-将数据聚合为多列

时间:2019-10-21 19:15:39

标签: python pandas dataframe pandas-groupby

我有一个包含未聚合数据的数据框,如下所示:

df[['UniqueID ', 'SrvDesc']]

    UniqueID SrvDesc
0   HEF104  Cash 
1   HEF104  Credit
2   HEF104  Deposit 
3   HEF104  Ticket
4   HEF104  Electronic
5   HEF197  Check
6   HEF197  Credit
7   HEF198  Credit
8   HEF198  Electronic
9   HEF198  Check

10 rows × 2 columns

如您所见,与每个唯一ID对应,SrvDesc有任意数量的唯一值(HEF104有5个唯一SrvDesc值,HEF198有3个,依此类推)。

我想做的是执行一些操作,该操作使我可以在UniqueID上聚合,以便每个UniqueID有一行,然后有任意数量的填充列,其中包含该给定UniqueID的SrvDesc的每个值:

    UniqueID SrvDesc_1  SrvDesc_2   SrvDesc_3   SrvDesc_4   SrvDesc_5
0   HEF104   Cash       Credit      Deposit     Ticket      Electronic
1   HEF197   Check      Credit
2   HEF198   Credit     Electronic  Check

我一直在研究pivotunstack,它们似乎非常有用,但是我不确定它们是否可以使我完全完成我在这里试图做的事情。 / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

使用:

struct ContentView: View {
    var body: some View {
        NavigationView {
            Text("")
                .navigationBarTitle("Türkiye", displayMode: .inline)
                .background(NavigationBarBuilder {navigationController in
                    navigationController.navigationBar.barTintColor = .red
                    navigationController.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
                })
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

df2['count']=df2.groupby('UniqueID').cumcount()+1
df2['count']='SrvDesc_'+df2['count'].astype('str')
new_df=df2.set_index(['UniqueID','count']).unstack('count')['SrvDesc'].reset_index()
print(new_df)

如果要删除列名:

count UniqueID SrvDesc_1   SrvDesc_2 SrvDesc_3 SrvDesc_4   SrvDesc_5
0       HEF104      Cash      Credit   Deposit    Ticket  Electronic
1       HEF197     Check      Credit       NaN       NaN         NaN
2       HEF198    Credit  Electronic     Check       NaN         NaN

如果需要fillna,可以在unstack方法中为fill_value字段指定一些值。

new_df.columns.name=None
print(new_df)

      UniqueID SrvDesc_1   SrvDesc_2 SrvDesc_3 SrvDesc_4   SrvDesc_5
0       HEF104      Cash      Credit   Deposit    Ticket  Electronic
1       HEF197     Check      Credit       NaN       NaN         NaN
2       HEF198    Credit  Electronic     Check       NaN         NaN

df2['count']=df2.groupby('UniqueID').cumcount()+1
df2['count']='SrvDesc_'+df2['count'].astype('str')
new_df=df2.set_index(['UniqueID','count']).unstack('count',fill_value='')['SrvDesc'].reset_index()
new_df.columns.name=None
print(new_df)