如何更改字符串列表的仅一部分(切片)的值

时间:2018-07-23 21:52:20

标签: python string python-3.x pandas for-loop

有人知道如何使用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

3 个答案:

答案 0 :(得分:2)

您的问题是,当您使用column_names遍历列表for i in column_names[1:-2]时,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'

答案 1 :(得分:2)

也可以使用add_suffixdf.rename

cols=['b', 'c']
ncols = df[cols].add_suffix('_suffix').columns

df.rename(columns={old:new for old,new in zip(cols,ncols)})

答案 2 :(得分:1)

有关如何使用forenumerate来调整range循环的信息,请参见@pault's solution

鉴于您正在使用熊猫,您可能对基于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数组的副本,然后将其分配回数据框。