<p>在您的代码中,您正在循环遍历数据帧的B列中的项,但是您没有方法索引回原始数据帧。具体来说,这条线:</p>
<p><code>df['B'][item] = item_v</code></p>
<p>不做你想做的事。它正在B列中放置一个索引为<code>item</code>的新项。如果你用一个小数据帧来尝试,你可能会在帧的末尾看到一些奇怪的值。当我尝试这个,我得到:</p>
<pre><code>In[36]: df
Out[36]:
A B
0 aa 1234
1 ab 3456
2 bc 1357
3 cc 8901
In[37]: df['B'][item] = item_v
In[38]: df['B']
Out[38]:
0 1234
1 3456
2 1357
3 8901
8901 8901 <-- ???
Name: B, dtype: object
</code></pre>
<p>更糟糕的是,这一行并没有将值插入到您期望的数据帧中。只有在查看<code>df['B']</code>时,才能看到新元素。如果您只查看<code>df</code>,您将看到原始数据帧,而没有额外的项。</p>
<p>在数据帧中设置元素的正确方法是使用<code>.loc[]</code>类似于:</p>
<p><code>df.loc[item,'B'] = item_v</code></p>
<p>这仍然不能解决最初的问题,即如何获得正确的索引。原始代码的一个修复方法是为列表中B列中的每个项累积值,然后将其重新分配给B列,如下所示:</p>
<pre><code>newB = []
for item in df['B']:
if len(item) > 4:
item_v = str(item[1:5])
else:
item_v = item
newB.append(item_v)
print(newB)
df.loc[:, 'B'] = newB
</code></pre>
<p>但是,对于<code>pandas</code>,也有一些解决方案不需要直接迭代B列中的项</p>
<p>例如,可以使用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html" rel="nofollow noreferrer">^{<cd8>}</a>来替换长度超过4个字符的字符串以及<a href="http://pandas.pydata.org/pandas-docs/stable/text.html" rel="nofollow noreferrer">^{<cd9>}</a>函数来操作文本元素。这艘班轮的任务是:</p>
<pre><code>df.loc[:,'B'] = df['B'].where((df['B'].str.len() <= 4), df['B'].str[1:5])
</code></pre>
<p>此语句创建一个序列,其中包含列B中的项(如果该项为4个或更少字符),或者如果该项超过4个字符,则包含列B中该项的切片[1:5]。然后,这个序列被指定替换<code>df</code>中的列B。</p>