<p>您的问题可以通过两个步骤轻松解决:</p>
<p><strong>第一步:</strong></p>
<pre><code>import math
df['some_stuff'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
</code></pre>
<p>这行代码创建了一个新的列<code>some_stuff</code>,我这样做的目的是在数据中引入<code>gain and loss</code>的一些逻辑。在</p>
<p>如果您不想要一个新的列并且您喜欢这个想法,只需将<code>qty</code>列替换为如下所示:</p>
^{pr2}$
<p>接下来,我使用这个新列创建您的<code>position column</code>,如下所示:</p>
<pre><code>df['position'] = df.groupby(['team','account','scrip'])['some_stuff'].cumsum()
</code></pre>
<p>生成此列:</p>
<pre><code>position
2
2
2
0
1
-1
</code></pre>
<p><em>奖金:</em></p>
<p>如果要删除多余的列<code>some_stuff</code>,只需使用:</p>
<pre><code>del df['some_stuff']
</code></pre>
<p><strong>第二步:</strong></p>
<p>在该步骤中,您可以使用以下行获取最终分组表:</p>
<pre><code>print(df.groupby(['team', 'account', 'scrip']).min())
</code></pre>
<p>最终输出:</p>
<pre><code> time buy_price sell_price qty position
team account scrip
team1 A1 FUT1 06/07/17 09:36 50.0 50.0 1 1
A2 FUT1 06/07/17 09:46 100.0 NaN 2 2
team2 A3 FUT1 06/07/17 09:56 10.0 10.0 1 -1
</code></pre>
<p>我相信这能回答你的问题。在</p>
<p><strong>文档:</strong></p>
<p><a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html" rel="nofollow noreferrer">pandas.DataFrame.apply</a></p>
<p><a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html" rel="nofollow noreferrer">pandas.Groupby</a></p>
<p><a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.cumsum.html" rel="nofollow noreferrer">pandas.DataFrame.cumsum</a></p>
<p><a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.min.html" rel="nofollow noreferrer">pandas.DataFrame.min</a></p>