<p>你可以这样做:</p>
<pre><code>In[75]:
df['Position'] = df['Position'] + df.groupby('Position')['Position'].rank(method='first')/10
df
Out[75]:
Position Menge
0 200.1 3
1 200.2 3
2 200.3 3
3 400.1 7
4 400.2 7
5 400.3 7
6 400.4 7
7 400.5 7
8 400.6 7
9 400.7 7
</code></pre>
<p>所以这里I<code>groupby</code>在<code>'Position'</code>上,用param <code>method='first'</code>调用<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rank.html#pandas.DataFrame.rank" rel="nofollow noreferrer">^{<cd3>}</a>,使相等的值按照出现的顺序排列,这有效地按照与计数器相同的顺序排列值</p>
<p>您的错误来自:</p>
<pre><code>counter=selected['Menge']
</code></pre>
<p>然后使用以下方法进行比较:</p>
<pre><code>while counter>=1:
</code></pre>
<p>所以这个错误告诉你它不知道如何解释一个<code>Series</code>,因为<code>counter >=</code>返回一个布尔序列,它需要一个标量布尔值来解释。您必须逐行迭代,这样才能得到一个标量值,以便正确地解释,此外,您应该尽可能避免循环,因为它很慢</p>
<p><strong>编辑</p>
<p>根据您的新数据,您只需在多个列上<code>groupby</code>:</p>
<pre><code>In[81]:
df['Position'] = df['Position'] + df.groupby(['Position','Menge'])['Position'].rank(method='first')/10
df
Out[81]:
Position Menge Product
0 200.1 3 a
1 200.2 3 a
2 200.3 3 a
3 400.1 7 b
4 400.2 7 b
5 400.3 7 b
6 400.4 7 b
7 400.5 7 b
8 400.6 7 b
9 400.7 7 b
10 200.1 4 c
11 200.2 4 c
12 200.3 4 c
</code></pre>
<p><strong>编辑</p>
<p>好的,要处理出现次数超过10次的情况,以避免执行<code>201</code>,例如:</p>
<pre><code>In[98]:
df['Position'] = (df['Position'].astype(str) + '.' + df.groupby(['Position','Menge'])['Position'].rank(method='first').astype(int).astype(str)).astype(float)
df
Out[98]:
Position Menge Product
0 200.1 3 a
1 200.2 3 a
2 200.3 3 a
3 400.1 7 b
4 400.2 7 b
5 400.3 7 b
6 400.4 7 b
7 400.5 7 b
8 400.6 7 b
9 400.7 7 b
10 200.1 4 c
11 200.2 4 c
12 200.3 4 c
13 200.4 4 c
</code></pre>
<p>因此,这首先将输出从<code>rank</code>转换为<code>int</code>,因为它生成一个<code>float</code>,然后转换为<code>str</code>,因此我们可以创建一个字符串,例如<code>'200' + '.' + '1'</code>,然后在必要时转换回<code>float</code></p>