我想从一个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'
数据看起来像-
我正在获取这些列名称['statusNY','statusPA','statusIL','statusOR','statusNJ'],并从中提取状态名称[NY,PA,IL,OR和NJ]。然后,我将检查“ product_code”列中是否包含这些状态名称。如果为true,则将1分配给“ statusNY”;如果为false,则将0分配给“ statusNY”。对于其余的列名“ statusPA”,“ statusIL”,“ statusOR”,“ statusNJ”
输出应如下所示:
我有以下代码:
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上进行了搜索,还检查了其他相关帖子,但结果与我的情况不太相关。
答案 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的子字符串。