Python中列值(字符串)的反向连接

Python中列值(字符串)的反向连接,python,string,python-3.x,pandas,Python,String,Python 3.x,Pandas,我试图通过递减列连接字符串,并假设表如下所示。我正在创建固定数量(5)的新列&希望每个列都有由非空字符串连接的字符串。假设对于行-1,第一个串联将是stru\u 1;stru2;STR_3和第二个串联应该是STR_1;STR_2和第三个串联应为STR_1&其余单元格应保持为空 MAJOR_BRAND | SUB_SEGMENT | PACKAGE_TYPE | PACKAGE | SIZE | FLAVOR | VOLUME -------------------------------

我试图通过递减列连接字符串,并假设表如下所示。我正在创建固定数量(5)的新列&希望每个列都有由非空字符串连接的字符串。假设对于
行-1
,第一个串联将是
stru\u 1;stru2;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            |            | 

真诚的帮助将不胜感激

又快又脏。注意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                          

我想是另一种方法

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    

所以连接操作应该在数据帧的所有列上从左到右进行,产生一个或多个字符串的每个附加连接,并在列中找到的第一个空字符串处停止进程?另外,关于第二行,当您说
第二个串联应该是STR_1;STR_2
,为什么不是STR_1;stru2;Stru_3?编辑:我明白了,“第一次连接”是指最后一次连接,操作顺序相反。您需要递归地在dataframe上使用.apply()函数,该函数应该首先检查空字符串。