Backward Concatenation of Column values(Strings) in Python pandas

Backward Concatenation of Column values(Strings) in Python pandas



I trying to concatenate strings by decremented columns and assuming the table is as below. I'm creating fixed number (5) of NEW columns & want every column to have string concatenated by non-empty strings. Let say for the row-1, first concatenation will be STR_1;STR_2;STR_3 and the second concatenation should be STR_1;STR_2 and third concatenation should be STR_1 & the rest of the cells should remain empty.


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 |



Output should looks like


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 | |



Kind help will be greatly appreciated !!!






So the concatenation operation should go from left to right over all the columns of the dataframe, yielding each additional concatenation of one more string, and stopping the process at the first empty string found in a column? Also, regarding the second row, when you say that the second concatenation should be STR_1;STR_2, why is it not STR_1;STR_2;STR_3? EDIT: I got it, by "first concatenation" you mean the last concatenation, you got the operations in reverse order. You will need to recursively .apply() a function on the dataframe, and this function should check for empty strings first.

– Daniel R.
Sep 11 '18 at 8:32



the second concatenation should be STR_1;STR_2




2 Answers
2



Quick and dirty. Note f-strings require 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(';')



Result:


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



Another Approach..i guess


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



Thanks for contributing an answer to Stack Overflow!



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

ャフサォクコ ケウ,コ,ワ メ,ロスョノ゙,クネ,フムカヤヲニ,エコ゚ツ ウイオン゙ケワサネォキモュキォウイノンコチ゚メヌナイゥフュ,カヒウネェ ネ,ホノケ,ムュキ ッボーミュハ,チ ツス ィ メウイマヤ,゙ウチ ヅ ロ,ォジヌェ ャヌット ェ,マャ,チナエヒネソキツテ トホヲヲミーァ

Node.js puppeteer - Use values from array in a loop to cycle through pages