Python 遍历列表列并根据列表顺序追加其他列

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:

我试图创建一个函数,根据“tag_list”列中列表的顺序附加颜色列(橙色、黑色、白色、灰色、棕色)。例如,如果“橙色”是tag_列表中的第一种颜色,我希望该行在橙色列中有一个“1”,如果列表中的第二种颜色是“黑色”,我希望该行在黑色列中有一个“2”

我正在考虑为每种颜色制作一个函数,并尝试:

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