如何更改字符串列表的仅部分(切片)的值
Posted
技术标签:
【中文标题】如何更改字符串列表的仅部分(切片)的值【英文标题】:How to change the values of only part (slice) of a list of strings 【发布时间】:2018-12-31 10:19:21 【问题描述】:有人知道如何使用 for 循环连接字符串列表吗?
这是有效的,没有循环:
提取列名
column_names = file.columns.tolist()
column_names[1]= column_names[1] + '_Vol_Adj'
column_names[1]
但不能作为以下循环的一部分:
for i in column_names[1:-2]:
column_names[i]= column_names[i] + '_Vol_Adj'
i = i+1
TypeError Traceback (most recent call last) <ipython-input-242-5509cede9f32> in <module>() 2 3 for i in column_names[1:-2]: ----> 4 column_names[i]= column_names[i] + '_Vol_Adj' 5 i = i+1 TypeError: list indices must be integers or slices, not str
【问题讨论】:
for i in column_names[1:-2]
不会遍历列表中的索引。在你的循环中尝试print(i)
,你会看到问题。相关:Accessing the index in 'for' loops?
【参考方案1】:
您的问题是,当您使用for i in column_names[1:-2]
遍历列表column_names
时,i
的值将是列表中的元素(而不是相应的索引)。
在您的情况下,一件简单的事情是使用enumerate
,如下例所示:
column_names = ["a", "b", "c", "d", "e"]
for i, val in enumerate(column_names[1:-2]):
column_names[i+1] += '_Vol_Adj'
print(column_names)
#['a', 'b_Vol_Adj', 'c_Vol_Adj', 'd', 'e']
我正在循环内更新索引 i+1
处的值,因为我们从索引 1 开始迭代。
或者你可以使用range(1, len(column_names)-2)
作为@Barmar suggested:
for i in range(1, len(column_names)-2):
column_names[i+1] += '_Vol_Adj'
【讨论】:
另一个选项是range(1, len(column_names)-2)
,那么你不需要使用i+1
【参考方案2】:
也可以使用add_suffix
和df.rename
cols=['b', 'c']
ncols = df[cols].add_suffix('_suffix').columns
df.rename(columns=old:new for old,new in zip(cols,ncols))
【讨论】:
【参考方案3】:请参阅@pault's solution,了解如何使用enumerate
或range
调整for
循环。
鉴于您使用的是 Pandas,您可能对基于 NumPy 的解决方案感兴趣:
import pandas as pd, numpy as np
df = pd.DataFrame(columns=list('ABCDE'))
arr = df.columns.values
arr[1:-1] += '_Vol_Adj'
df.columns = arr
print(df.columns)
Index(['A', 'B_Vol_Adj', 'C_Vol_Adj', 'D_Vol_Adj', 'E'], dtype='object')
不要直接修改df.columns.values
,这一点很重要,因为这会产生副作用。在这里,我们修改了底层 NumPy 数组的副本,然后分配回数据帧。
【讨论】:
以上是关于如何更改字符串列表的仅部分(切片)的值的主要内容,如果未能解决你的问题,请参考以下文章