<pre><code>import pandas as pd
df = pd.read_table('data', sep='\s+')
mask = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
mask = mask.groupby(df['ID']).transform('any')
df.loc[mask, 'Class'] = 'Wet'
print(df)
</code></pre>
<p>收益率</p>
<pre><code> ID Class Status Species
0 1 Wet D Carex
1 1 Wet C Eupesu
2 1 Wet C Poapra
3 2 Wet D Carcra
4 2 Wet C Eupesu
5 2 Wet C Poapra
6 3 Limy D Poapra
7 3 Limy C Eupesu
8 3 Limy C Poapra
</code></pre>
<hr/>
<p>任务</p>
<pre><code>df['mask'] = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
</code></pre>
<p>使<code>df</code>看起来像这样:</p>
<pre><code>In [166]: df
Out[166]:
ID Class Status Species mask
0 1 Sands D Carex True
1 1 Sands C Eupesu False
2 1 Sands C Poapra False
3 2 Limy D Carcra True
4 2 Limy C Eupesu False
5 2 Limy C Poapra False
6 3 Limy D Poapra False
7 3 Limy C Eupesu False
8 3 Limy C Poapra False
</code></pre>
<p>现在,(感谢DSM):</p>
<pre><code>mask = ((df['Status'] == 'D')
& df['Species'].isin(['Carex','Carcra']))
mask = mask.groupby(df['ID']).transform('any')
</code></pre>
<p>将<code>mask</code>按<code>df['ID']</code>分组,如果原始<code>mask</code>中的任何</em>值为真,则将<code>True</code>分配给该组的所有行,否则<code>False</code>。你知道吗</p>
<pre><code>In [168]: mask
Out[168]:
0 True
1 True
2 True
3 True
4 True
5 True
6 False
7 False
8 False
dtype: bool
</code></pre>
<p><code>df.loc</code>可用于从<code>df</code>中选择行和列。
<code>df.loc[mask]</code>选择<code>mask</code>为真的行:</p>
<pre><code>In [169]: df.loc[mask]
Out[169]:
ID Class Status Species mask
0 1 Sands D Carex True
1 1 Sands C Eupesu False
2 1 Sands C Poapra False
3 2 Limy D Carcra True
4 2 Limy C Eupesu False
5 2 Limy C Poapra False
</code></pre>
<p><code>df.loc[mask, 'Class']</code>进一步选择列<code>Class</code>:</p>
<pre><code>In [170]: df.loc[mask, 'Class']
Out[170]:
0 Sands
1 Sands
2 Sands
3 Limy
4 Limy
5 Limy
Name: Class, dtype: object
</code></pre>
<p><code>df.loc[mask]['Class'] = value</code>可能无法修改<code>df</code>,因为<code>df.loc[mask]</code>返回一个副本。(这同样适用于<code>df[mask]['Class'] = value</code>)。使用<code>[...]</code>两次被称为“链式索引”,如果我们避免链式索引,这个问题是可以避免的。你知道吗</p>
<p>因此,不要使用<code>[...]</code>两次,而是使用<code>df.loc[mask, 'Class'] = 'Wet'</code>:</p>
<pre><code>In [172]: df
Out[172]:
ID Class Status Species
0 1 Wet D Carex
1 1 Wet C Eupesu
2 1 Wet C Poapra
3 2 Wet D Carcra
4 2 Wet C Eupesu
5 2 Wet C Poapra
6 3 Limy D Poapra
7 3 Limy C Eupesu
8 3 Limy C Poapra
</code></pre>