<p>我认为“矢量化”解决方案的性能会比这个更好,而且无论是那个版本还是<code>where</code>版本都更“优秀”。这个答案只是向你展示如何使用更像你所遵循的方法来实现你想要的。这不是一个非常“熊猫”式的做事方式,但可能有助于理解为什么你尝试的东西不起作用</p>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
data = {'ID': ['001', '002', '003', '004'],
'Number': [99, 99, 20, 40]}
# Don't actually need the NaN-filled 'Alloc1' and 'Alloc2' yet
# Those columns get created when you give them values, later
df = pd.DataFrame(data)
def allocateCodes(row):
if (row['Number'] == 99):
row['Alloc1'] = 31
row['Alloc2'] = 3
else:
row['Alloc1'] = 0
row['Alloc2'] = row['Number'] / 2
return row
# axis="columns" means go 'take each row' (i.e., a whole set of columns)
# at a time (can also use axis=1)
# instead of 'take each column' (axis="rows" / axis=0)
outputDf = df.apply(allocateCodes, axis="columns")
print(outputDf)
</code></pre>
<p>产出:</p>
<pre class="lang-none prettyprint-override"><code> ID Number Alloc1 Alloc2
0 001 99 31 3.0
1 002 99 31 3.0
2 003 20 0 10.0
3 004 40 0 20.0
</code></pre>