<h2>解决方案</h2>
<p>我相信有更好的方法,但这里有一种方法:</p>
<pre class="lang-py prettyprint-override"><code>df["B"] = ""
repeat_mapping = {"repeat3": [0]*4,
"repeat2": [*range(4, 0, -1)],
"repeat1": [*range(1, 5)]}
repeats = df[::5]["Pos"].map(repeat_mapping).explode()
repeats.index += pd.Series([*range(4)]*len(df[::5]))
df["B"][repeats.index] = repeats
</code></pre>
<p>输出:</p>
<pre class="lang-py prettyprint-override"><code> A Pos B
0 Emo/3 repeat3 0
1 Emo/4 repeat3 0
2 Emo/1 repeat3 0
3 Emo/3 repeat3 0
4
5 Emo/3 repeat1 1
6 Emo/4 repeat1 2
7 Emo/1 repeat1 3
8 Emo/3 repeat1 4
9
10 Neu/5 repeat2 4
11 Neu/2 repeat2 3
12 Neu/5 repeat2 2
13 Neu/2 repeat2 1
</code></pre>
<h2>台阶</h2>
<p>准备新专栏:</p>
<pre class="lang-py prettyprint-override"><code>In [1]: df["B"] = ""
In [2]: df
Out[2]:
A Pos B
0 Emo/3 repeat3
1 Emo/4 repeat3
2 Emo/1 repeat3
3 Emo/3 repeat3
4
5 Emo/3 repeat1
6 Emo/4 repeat1
7 Emo/1 repeat1
8 Emo/3 repeat1
9
10 Neu/5 repeat2
11 Neu/2 repeat2
12 Neu/5 repeat2
13 Neu/2 repeat2
</code></pre>
<p>抓住第五排:</p>
<pre class="lang-py prettyprint-override"><code>In [3]: df[::5]["Pos"]
Out[3]:
0 repeat3
5 repeat1
10 repeat2
Name: Pos, dtype: object
</code></pre>
<p>使用<code>repeat_mapping</code>:</p>
<pre class="lang-py prettyprint-override"><code>In [4]: df[::5]["Pos"].map(repeat_mapping)
Out[4]:
0 [0, 0, 0, 0]
5 [1, 2, 3, 4]
10 [4, 3, 2, 1]
Name: Pos, dtype: object
</code></pre>
<p>分解列表:</p>
<pre class="lang-py prettyprint-override"><code>In [5]: repeats = df[::5]["Pos"].map(repeat_mapping).explode()
In [6]: repeats
Out[6]:
0 0
0 0
0 0
0 0
5 1
5 2
5 3
5 4
10 4
10 3
10 2
10 1
Name: Pos, dtype: object
</code></pre>
<p>注意<code>repeats</code>中的每个索引都重复了4次。我们将通过将每个索引增加<code>0, 1, 2, 3</code>来解决这个问题:</p>
<pre class="lang-py prettyprint-override"><code>In [7]: pd.Series([*range(4)]*len(df[::5])).values
Out[7]: array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)
In [8]: repeats.index += pd.Series([*range(4)]*len(df[::5]))
In [9]: repeats
Out[9]:
0 0
1 0
2 0
3 0
5 1
6 2
7 3
8 4
10 4
11 3
12 2
13 1
Name: Pos, dtype: object
</code></pre>
<p>最后,<code>df["B"][repeats.index]</code>只选择其索引与<code>repeats</code>索引匹配的行,然后将<code>repeats</code>的值分配给这些行</p>