Обратная конкатенация значений столбцов (строк) в пандах Python - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь объединить строки по уменьшенным столбцам и предположить, что таблица такая, как показано ниже. Я создаю фиксированное число (5) новых столбцов и хочу, чтобы в каждом столбце были строки, объединенные непустыми строками. Допустим, для row-1 первая конкатенация будет STR_1;STR_2;STR_3, а вторая конкатенация должна быть STR_1;STR_2, а третья конкатенация должна быть STR_1, а остальные ячейки должны оставаться пустыми.

MAJOR_BRAND | SUB_SEGMENT | PACKAGE_TYPE | PACKAGE |  SIZE   | FLAVOR  | VOLUME
-------------------------------------------------------------------------------------
STR_1       | STR_2       | STR_3        |         |         |         |
STR_1       | STR_2       | STR_3        |         |         |         | STR_7
STR_1       |             |              | STR_4   | STR_5   | STR_6   | STR_7
STR_1       |             | STR_3        |         |         | STR_6   | STR_7
STR_1       |             | STR_3        |         |         | STR_6   |    

Вывод должен выглядеть как

 STR_JOIN_1                   | STR_JOIN_2             | STR_JOIN_3      | STR_JOIN_4 | STR_JOIN_5
----------------------------------------------------------------------------------------------------
STR_1;STR_2;STR_3             |STR_1;STR_2             |STR_1            |            |
STR_1;STR_2;STR_3;STR_7       |STR_1;STR_2;STR_3       |STR_1;STR_2      |STR_1       |       
STR_1;STR_4;STR_5;STR_6;STR_7 |STR_1;STR_4;STR_5;STR_6 |STR_1;STR_4;STR_5|STR_1;STR_4 | STR_1   
STR_1;STR_3;STR_6;STR_7       |STR_1;STR_3;STR_6       |STR_1;STR_3      |STR_1       |
STR_1;STR_3;STR_6             |STR_1;STR_3             |STR_1            |            | 

Добрая помощь будет принята с благодарностью !!!

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Другой подход ... я думаю

new_data = pd.DataFrame(columns=['STR_JOIN_{}'.format(i) for i in range(1, len(initial_data.columns))])

loc = 0
for i in range(len(initial_data)):#initial_data being the input

    temp_list = [ x for x in list(initial_data.loc[i].values) if x ]

    new_data.loc[loc] = ['']*(len(initial_data.columns)-1)

    for j in range(len(temp_list)):
        new_data['STR_JOIN_{}'.format(j+1)][loc] = ';'.join(data[:len(data)-j])

    loc+=1    
0 голосов
/ 11 сентября 2018

Быстро и грязно. Примечание. Для f-строк требуется Python 3.6 +.

res = pd.DataFrame(columns=[f'STR_JOIN_{i}' for i in range(1, 6)])

res['STR_JOIN_1'] = df.apply(lambda x: ';'.join(filter(None, x)), axis=1)

for i in range(2, 6):
    res[f'STR_JOIN_{i}'] = res[f'STR_JOIN_{i-1}'].str.split(';').str[:-1].str.join(';')

Результат:

print(res)

                      STR_JOIN_1               STR_JOIN_2         STR_JOIN_3  \
0              STR_1;STR_2;STR_3              STR_1;STR_2              STR_1   
1        STR_1;STR_2;STR_3;STR_7        STR_1;STR_2;STR_3        STR_1;STR_2   
2  STR_1;STR_4;STR_5;STR_6;STR_7  STR_1;STR_4;STR_5;STR_6  STR_1;STR_4;STR_5   
3        STR_1;STR_3;STR_6;STR_7        STR_1;STR_3;STR_6        STR_1;STR_3   
4              STR_1;STR_3;STR_6              STR_1;STR_3              STR_1   

    STR_JOIN_4 STR_JOIN_5  
0                          
1        STR_1             
2  STR_1;STR_4      STR_1  
3        STR_1             
4                          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...