<p>下面是一种使用<code>lambda</code>和<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html" rel="nofollow noreferrer">^{<cd2>}</a>和<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html" rel="nofollow noreferrer">^{<cd3>}</a>的方法:</p>
<pre><code>f = lambda x: (x.ne(x.shift()) & x.shift().notna()).astype(int)
df['Flipped'] = df.groupby('DISTRICT')['DOMINANT_PARTY'].apply(f).values
</code></pre>
<h3>更新-解释</h3>
<p>这里的<code>lambda</code>是函数的缩写</p>
<pre><code>def flipped(x):
return x.ne(x.shift()) & x.shift().notna()
</code></pre>
<p>函数采用<code>Series</code>—在本例中为<code>['DOMINANT_PARTY']</code></p>
<p>让我们看看有“翻转”需要解释的地区(地区19):</p>
<pre><code> DISTRICT Year DOMINANT_PARTY ...
90 19 2014 REP ...
91 19 2015 REP ...
92 19 2016 DEM ...
93 19 2017 DEM ...
94 19 2018 DEM ...
</code></pre>
<p>这里我们应用函数的<code>x</code>是:</p>
<pre><code>90 REP
91 REP
92 DEM
93 DEM
94 DEM
</code></pre>
<p>而<code>x.shift()</code>是:</p>
<pre><code>90 NaN
91 REP
92 REP
93 DEM
94 DEM
</code></pre>
<p>函数<code>f</code>中的第一个逻辑表达式将这些序列与<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.ne.html" rel="nofollow noreferrer">^{<cd10>}</a>方法(不相等)进行比较,后者是:</p>
<pre><code>90 REP != NaN True
91 REP != REP False
92 DEM != REP True
93 DEM != DEM False
94 DEM != DEM False
</code></pre>
<p>注意我们有2<code>True</code>个值,因为第一行-'REP'确实不等于NaN。
这就是为什么我们有第二个逻辑表达式来满足<code>x.shift()</code>不等于<code>NaN</code>(<code>x.shift().notna()</code>)。
<code>&</code>运算符是逻辑AND语句,要求同时满足这两个条件</p>
<pre><code>90 REP != NaN False
91 REP != REP False
92 DEM != REP True
93 DEM != DEM False
94 DEM != DEM False
</code></pre>