错误“ builtin_function_or_method”对象不可下标-在for循环内追加列表时

时间:2018-08-15 20:32:42

标签: python list pandas

我想从一个for循环中的现有列表创建一个新列表,然后将该列表通过if else语句传递,一次传递一个元素。我没有适当的知识以这种方式使用列表。因此,这篇文章

样本数据:

f = {'Sales_Person': ['John', 'Tom', 'Dick', 'Harry', 'Rob', 'Mike', 'Miz', 'Sally', 'Buck', 'Roger'],  'location': ['NY', 'NY', 'NY', 'NJ', 'PA', 'NJ', 'NJ', 'PA', 'NY', 'NJ'], 'product_code': ['10NYXX', '11NYXX', '10NYXX', '10NJXY', '11PAXY', '11MNYY', '12NJYX', '11PAYY', '12NYXX', '11CAPQ']}
df1 = pd.DataFrame(data = f)
df1['statusNY'] = 'n/a'
df1['statusPA'] = 'n/a'
df1['statusIL'] = 'n/a'
df1['statusOR'] = 'n/a'
df1['statusNJ'] = 'n/a'

数据看起来像-

enter image description here

我正在获取这些列名称['statusNY','statusPA','statusIL','statusOR','statusNJ'],并从中提取状态名称[NY,PA,IL,OR和NJ]。然后,我将检查“ product_code”列中是否包含这些状态名称。如果为true,则将1分配给“ statusNY”;如果为false,则将0分配给“ statusNY”。对于其余的列名“ statusPA”,“ statusIL”,“ statusOR”,“ statusNJ”

输出应如下所示:

enter image description here

我有以下代码:

for col in ['statusNY', 'statusPA', 'statusIL', 'statusOR', 'statusNJ']:
    x = col[6:8]
    df1.loc[df1['product_code'].str.contains(x) == True, col] = '1'
    df1.loc[df1['product_code'].str.contains(x) == False, col] = '0' 

理想情况下,第二行应创建一个列表,该列表应通过第三和第四行。但这不起作用。

然后我想到了追加列表-

newlist = []
for col in ['statusNY', 'statusPA', 'statusIL', 'statusOR', 'statusNJ']:
    newlist.append[col[6:8]]

但是最终出现此错误:TypeError:“ builtin_function_or_method”对象不可下标。我在Google上进行了搜索,还检查了其他相关帖子,但结果与我的情况不太相关。

2 个答案:

答案 0 :(得分:1)

append[col[6:8]]更改为append(col[6:8])

append[blah]试图从函数中获取元素

答案 1 :(得分:0)

为什么不这样使用pipe

def flag_product_code(df, states):
    df = df.copy()

    for state in states:
        df['status' + state] = (df.product_code
                                  .str.contains(state)
                                  .astype(int))

    return(df)

df1.pipe(flag_product_code, ['NY', 'PA', 'IL', 'OR', 'NJ'])

这将创建一个函数来标记所需的任何状态,并将列追加到原始DataFrame。

也就是说,您会得到一些意想不到的结果;具体来说,您的数据的第5行的product_code值为'11MNYY'将标记为NY。如果您知道product_type的格式将始终与示例数据中的格式相同,则您可能需要检查product_type的子字符串。