首页 > 解决方案 > Pandas - 按单元格中的项目数拆分列

问题描述

我有一个看起来像这样的数据框:

df1 = pd.DataFrame({'Name':['Row 1', 'Row 2', 'Row 3', 'Row 4'], 
                'Original':['A, B, C, D, E', 'A, B, C', 'A, B, C, D, E, F, G, H, I, J, K, L', 'A']})

并希望将原始列拆分为多列,但将它们分组为 5 组,如下所示:

df2 = pd.DataFrame({'Name':['Row 1', 'Row 2', 'Row 3', 'Row 4'], 
                'Group 1':['A, B, C, D, E', 'A, B, C', 'A, B, C, D, E', 'A'],
                'Group 2':['', '', 'F, G, H, I, J', ''],
                'Group 3':['', '', 'K, L', '']})

我试过做这样的事情,但我很确定有更好的方法来做到这一点......

df1 = pd.DataFrame({'Name':['Row 1', 'Row 2', 'Row 3', 'Row 4'], 
                    'Original':['A, B, C, D, E', 'A, B, C', 'A, B, C, D, E, F, G, H, I, J, K, L', 'A']})

df2 = df1.join(df1['Original'].str.split(', ', expand=True).add_prefix('Individual '))

df2 = df2.fillna('')

df2['Group 1'] = (df2['Individual 0'] + ', ' +df2['Individual 1'] + ', ' + df2['Individual 2'] + ', ' + df2['Individual 3'] + ', ' + df2['Individual 4'] + ', ').str.strip(', ')
df2['Group 2'] = (df2['Individual 5'] + ', ' +df2['Individual 6'] + ', ' + df2['Individual 7'] + ', ' + df2['Individual 8'] + ', ' + df2['Individual 9'] + ', ').str.strip(', ')

有人有什么建议吗?也许某种循环除以原始单元格中的最大数量或项目?

谢谢,麻烦您了!

标签: pythonpandasdataframe

解决方案


使用GroupBy.sum对每 5 列求和np.arange

df3 = df1['Original'].str.split(',', expand=True).fillna('').add(',')
len_cols = len(df3.columns)
df1[['Name']].join(df3.groupby(np.arange(len_cols) // 5, axis=1)
                      .sum()
                      .stack()
                      .str.rstrip(',')
                      .unstack()
                      .rename(columns=dict(zip(range(len_cols),
                                               range(1, len_cols + 1))))
                      .add_prefix('Group '))

    Name        Group 1         Group 2 Group 3
0  Row 1  A, B, C, D, E                        
1  Row 2        A, B, C                        
2  Row 3  A, B, C, D, E   F, G, H, I, J    K, L
3  Row 4              A                        

推荐阅读