Python 遍历列表列并根据列表顺序追加其他列
我试图创建一个函数,根据“tag_list”列中列表的顺序附加颜色列(橙色、黑色、白色、灰色、棕色)。例如,如果“橙色”是tag_列表中的第一种颜色,我希望该行在橙色列中有一个“1”,如果列表中的第二种颜色是“黑色”,我希望该行在黑色列中有一个“2” 我正在考虑为每种颜色制作一个函数,并尝试:Python 遍历列表列并根据列表顺序追加其他列,python,pandas,dataframe,Python,Pandas,Dataframe,我试图创建一个函数,根据“tag_list”列中列表的顺序附加颜色列(橙色、黑色、白色、灰色、棕色)。例如,如果“橙色”是tag_列表中的第一种颜色,我希望该行在橙色列中有一个“1”,如果列表中的第二种颜色是“黑色”,我希望该行在黑色列中有一个“2” 我正在考虑为每种颜色制作一个函数,并尝试: cats = {'lesson_name': {0: 'Mutt', 1: 'Ragdoll', 2: 'Black', 3: 'Calico', 4: 'Tortoise', 5:
cats = {'lesson_name': {0: 'Mutt',
1: 'Ragdoll',
2: 'Black',
3: 'Calico',
4: 'Tortoise',
5: 'Mainecoon'},
'tag_list': {0: ['Orange', 'Black', 'White'],
1: ['Grey', 'White'],
2: ['Black','Brown'],
3: ['Orange','Grey','White'],
4: ['Orange', 'Brown','White'],
5: ['Grey','White']},
'Orange': {0: '',
1: '',
2: '',
3: '',
4: '',
5: ''},
'Black': {0: '',
1: '',
2: '',
3: '',
4: '',
5: ''},
'White': {0: '',
1: '',
2: '',
3: '',
4: '',
5: ''},
'Grey': {0: '',
1: '',
2: '',
3: '',
4: '',
5: ''},
'Brown': {0: '',
1: '',
2: '',
3: '',
4: '',
5: ''}}
cats_frame = pd.DataFrame(cats)
#我持有索引,例如1;例如,在第二回合中,列表为[灰色,白色]
对于i,枚举中的列表(cats\u frame.tag\u list):
#j变为索引编号(从1开始),颜色变为例如“灰色”
对于j,枚举中的颜色(a_列表,开始=1):
#根据标签列表将编号放在相应位置
#其中,我指向行,颜色指向列
cats_frame.loc[i,color]=str(j)
然后
我要警告您,可能有更有效的方法来实现这一点,但除非您的数据帧非常庞大,否则使用
df.iterrows()
以下是解决问题的一种方法:
#iterate over the rows
for idx, cols in cats_frame.iterrows():
#iterate over the columns containing color names
for c in cats_frame.columns[2:]:
#Check whether the column name appears in the list
if c in cols['tag_list']:
#If it does, find the index in the list, add 1 due to zero-indexing, and assign the value
cols[c]=cols['tag_list'].index(c)+1
else:
#otherwise, add 0
cols[c]=0
lesson_name tag_list Orange Black White Grey Brown
0 Mutt [Orange, Black, White] 1 2 3 0 0
1 Ragdoll [Grey, White] 0 0 2 1 0
2 Black [Black, Brown] 0 1 0 0 2
3 Calico [Orange, Grey, White] 1 0 3 2 0
4 Tortoise [Orange, Brown, White] 1 0 3 0 2
5 Mainecoon [Grey, White] 0 0 2 1 0
详细信息:
tag = pd.DataFrame(cats_frame['tag_list'].tolist())
tag_order = tag.stack().reset_index(level=1)\
.set_index(0, append=True)['level_1'].add(1).unstack(fill_value=0)
cats_frame.update(tag_order)
链接这些操作是惊人的!但这似乎比其他基于答案的答案要慢,你为什么认为呢?(quick benchmark给了其他人777和1250微秒,给了4630微秒)谢谢@Mustafaydın:)我想,对于使用for循环的较小数据集,在处理较大数据集时,这在性能方面应该更有效。尝试增加数据帧的大小,然后检查性能,如果发现任何差异,请告诉我。@MustafaAydın您可以尝试使用
cats_frame=pd.concat([cats_frame]*10000,ignore_index=True)重新创建一个更大的数据帧。
然后您可以使用timeit
来检查性能。确实,119毫秒对8.42秒和12.2秒!谢谢
#iterate over the rows
for idx, cols in cats_frame.iterrows():
#iterate over the columns containing color names
for c in cats_frame.columns[2:]:
#Check whether the column name appears in the list
if c in cols['tag_list']:
#If it does, find the index in the list, add 1 due to zero-indexing, and assign the value
cols[c]=cols['tag_list'].index(c)+1
else:
#otherwise, add 0
cols[c]=0
lesson_name tag_list Orange Black White Grey Brown
0 Mutt [Orange, Black, White] 1 2 3 0 0
1 Ragdoll [Grey, White] 0 0 2 1 0
2 Black [Black, Brown] 0 1 0 0 2
3 Calico [Orange, Grey, White] 1 0 3 2 0
4 Tortoise [Orange, Brown, White] 1 0 3 0 2
5 Mainecoon [Grey, White] 0 0 2 1 0
tag = pd.DataFrame(cats_frame['tag_list'].tolist())
tag_order = tag.stack().reset_index(level=1)\
.set_index(0, append=True)['level_1'].add(1).unstack(fill_value=0)
cats_frame.update(tag_order)
>>> tag
0 1 2
0 Orange Black White
1 Grey White None
2 Black Brown None
3 Orange Grey White
4 Orange Brown White
5 Grey White None
>> tag_order
0 Black Brown Grey Orange White
0 2 0 0 1 3
1 0 0 1 0 2
2 1 2 0 0 0
3 0 0 2 1 3
4 0 2 0 1 3
5 0 0 1 0 2
>> cats_frame
lesson_name tag_list Orange Black White Grey Brown
0 Mutt [Orange, Black, White] 1 2 3 0 0
1 Ragdoll [Grey, White] 0 0 2 1 0
2 Black [Black, Brown] 0 1 0 0 2
3 Calico [Orange, Grey, White] 1 0 3 2 0
4 Tortoise [Orange, Brown, White] 1 0 3 0 2
5 Mainecoon [Grey, White] 0 0 2 1 0