<p>IIUC我们做<code>explode</code>然后<code>cumcount</code>将组拆分为子组</p>
<pre><code>s=df.assign(column2=df.column2.str.split(' ')).explode('column2')
s=s.groupby([s.columnId,s.groupby('columnId').cumcount()//2]).\
agg({'columnId':'first','column2':' '.join,'column3':'first','countsOfWord':'first'})
s=s.assign(countsOfWord=2).reset_index(drop=True)
s
columnId column2 column3 countsOfWord
0 id1 hogedijk klarenbeek 2016 2
1 id2 hogedijk klarenbeek 2012 2
2 id2 zuidoost hogedijk 2012 2
3 id2 klarenbeek zuidoost 2012 2
4 id3 zuidoost clouds 2010 2
5 id4 artzuid zuidoost 2019 2
6 id4 hogedijk klarenbeek 2019 2
7 id4 zuidoost clouds 2019 2
8 id4 hogedijk klarenbeek 2019 2
</code></pre>
<p>或<code>findall</code>+<code>explode</code></p>
<pre><code>df.assign(column2=df.column2.str.replace(' ','-').str.findall("-".join(["[^-]+"] * 2))).explode('column2')
columnId column2 column3 countsOfWord
0 id1 hogedijk-klarenbeek 2016 2
1 id2 hogedijk-klarenbeek 2012 6
1 id2 zuidoost-hogedijk 2012 6
1 id2 klarenbeek-zuidoost 2012 6
2 id3 zuidoost-clouds 2010 2
3 id4 artzuid-zuidoost 2019 8
3 id4 hogedijk-klarenbeek 2019 8
3 id4 zuidoost-clouds 2019 8
3 id4 hogedijk-klarenbeek 2019 8
</code></pre>