【问题标题】: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

【问题讨论】:

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


【解决方案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_suffixdf.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,了解如何使用enumeraterange 调整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 数组的副本,然后分配回数据帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多