我尝试按递减的列连接字符串,并假定表如下。我正在创建固定数量(5)的NEW列,并希望每列都有由非空字符串连接的字符串。假设对于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 | |
非常感谢您的帮助!
答案 0 :(得分: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
答案 1 :(得分:0)
另一种方法..我猜
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