Simple use of itertools combinations inside apply and stack ie
from itertools import combinations ndf = df.groupby('ID')['words'].apply(lambda x : list(combinations(x.values,2))) .apply(pd.Series).stack().reset_index(level=0,name='words') ID words 0 1 (word1, word2) 1 1 (word1, word3) 2 1 (word2, word3) 0 2 (word4, word5) 0 3 (word6, word7) 1 3 (word6, word8) 2 3 (word6, word9) 3 3 (word7, word8) 4 3 (word7, word9) 5 3 (word8, word9)
So that you can accurately indicate the result, we must do
sdf = pd.concat([ndf['ID'],ndf['words'].apply(pd.Series)],1).set_axis(['ID','WordsA','WordsB'],1,inplace=False) ID WordsA WordsB 0 1 word1 word2 1 1 word1 word3 2 1 word2 word3 0 2 word4 word5 0 3 word6 word7 1 3 word6 word8 2 3 word6 word9 3 3 word7 word8 4 3 word7 word9 5 3 word8 word9
To convert it to one line, we can do:
combo = df.groupby('ID')['words'].apply(combinations,2)\ .apply(list).apply(pd.Series)\ .stack().apply(pd.Series)\ .set_axis(['WordsA','WordsB'],1,inplace=False)\ .reset_index(level=0)
source share