Pandas - Разделить столбец по количеству элементов в ячейке - PullRequest
3 голосов
/ 20 марта 2020

У меня есть кадр данных, который выглядит следующим образом:

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(', ')

У кого-нибудь есть предложения? Может быть, что-то вроде oop, которое делится на максимальное количество или количество элементов в исходной ячейке?

Пожалуйста и спасибо!

Ответы [ 2 ]

3 голосов
/ 20 марта 2020

Используйте 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                        
2 голосов
/ 20 марта 2020

с использованием cumcount и explode

s = df1['Original'].str.split(',').explode().reset_index()

s['idx'] = s.groupby(s['index']).cumcount() // 5

m = s.groupby(["index", "idx"])["Original"].agg(",".join).unstack().fillna("")

m.columns = (m.columns + 1).map(lambda x : 'Group ' + str(x))

df2 = pd.concat([df1,m],axis=1).drop('Original',axis=1)

print(df2)

  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                        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...