回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图清理数据帧中的列名,但只清理了部分列。在</p>
<p>当试图以某种方式替换数据帧片段上的列名时,它不起作用,这是为什么?在</p>
<p>假设我们有以下数据帧:<br/>
<em><strong>注意</strong>底部是可复制代码,用于复制数据:</em></p>
<pre><code> Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
</code></pre>
<p>我要清理列名(预期输出):</p>
^{pr2}$
<hr/>
<p><strong>方法1</strong>:</p>
<p>我可以像这样得到干净的列名:</p>
<pre><code>df.iloc[:, 1:].columns.str[:4]
Index(['ColA', 'ColB', 'ColC'], dtype='object')
</code></pre>
<p>或者</p>
<p><strong>方法2</strong>:</p>
<pre><code>s = df.iloc[:, 1:].columns
[col[:4] for col in s]
['ColA', 'ColB', 'ColC']
</code></pre>
<hr/>
<p><strong>但是</strong>当我试图覆盖列名时,什么都不会发生:</p>
<pre><code>df.iloc[:, 1:].columns = df.iloc[:, 1:].columns.str[:4]
Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
</code></pre>
<p>第二种方法:</p>
<pre><code>s = df.iloc[:, 1:].columns
cols = [col[:4] for col in s]
df.iloc[:, 1:].columns = cols
Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
</code></pre>
<hr/>
<p><strong>这确实有效</strong>,但您必须手动连接第一列的名称,这并不理想:</p>
<pre><code>df.columns = ['Value'] + df.iloc[:, 1:].columns.str[:4].tolist()
Value ColA ColB ColC
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
</code></pre>
<p>有没有更容易实现的方法?我错过什么了吗?在</p>
<hr/>
<p>复制数据帧:</p>
<pre><code>df = pd.DataFrame({'Value':[1,2,3,4],
'ColAfjkj':['a', 'b', 'c', 'd'],
'ColBhuqwa':['e', 'f', 'g', 'h'],
'ColCouiqw':['i', 'j', 'k', 'l']})
</code></pre>