要改写它,我正在生成一些虚拟数据。假设有一个客户列表(有些有多个交易),我想标记每个唯一客户。然后,我将生成相关的个人信息,例如性别,客户ID等。
我的步骤是: 1)创建所有唯一名称的列表 2)遍历我的数据框中的“名称”列 3)当“唯一名称”列表中的值与DataFrame“名称”匹配时,将1附加到列表中(然后从“唯一名称”列表中删除该名称,因此为该名称的每个后续实例创建一个0)。或者如果不匹配则保留0。
我尝试了几种方法,但是似乎都没有用,这似乎是最接近的方法,但是我找不到答案。
customers = [ ('jack', 34),
('tom', 30),
('jack', 31),
('jack', 32),
('jon', 16),
('tim', 17) ]
df = pd.DataFrame(customers, columns = ['Name' , 'Age'])
uniques = df.Name.unique().tolist()
uniques
worklist = []
for i in df:
if df["Name"] == uniques[i]:
worklist.append(i)
uniques.remove(i)
else:
worklist.append(0)
print(worklist)
print(uniques)
最后,我应该有一个虚拟变量列表(1,0s) [1,1,0,0,1,1] 同样,“唯一名称”列表应该为空。
但是,我不断收到此错误。
TypeError: list indices must be integers or slices, not str
答案 0 :(得分:0)
您遇到的错误是因为您没有循环您认为要循环的内容,因此在循环时实际上是循环了列名(“名称”和“年龄”),这意味着您要求{{1 }}和uniques["Name"]
会引发错误,列表索引不是str。
您可以使用字典而不是uniques["Age"]
变量的列表来执行某种切换按钮:
uniques
尽管customers = [ ('jack', 34),
('tom', 30),
('jack', 31),
('jack', 32),
('jon', 16),
('tim', 17) ]
df = pd.DataFrame(customers, columns = ['Name' , 'Age'])
uniques = {name: True for name in df['Name']}
worklist = []
for name in df["Name"]:
if uniques[name]:
worklist.append(1)
uniques[name] = False
else:
worklist.append(0)
print(worklist)
变量最后不是空的,但充满了全为“ False”的键,不确定其是否重要,如果可以告诉我,我将进行编辑。