Как обновить значения ячеек столбца pandas на основе сходства некоторых элементов с другими именами столбцов на уровне строк - PullRequest
2 голосов
/ 03 марта 2020

У меня есть фрейм данных, который выглядит следующим образом:

id   tag1 tag2 tag3 col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
id1  col3 col4 col7  0    0    0    0    0    0    0    0    0     0
id2  col1 col2 col9  0    0    0    0    0    0    0    0    0     0
id3  col2 col5 col6  0    0    0    0    0    0    0    0    0     0
id4  col3 col6 col10 0    0    0    0    0    0    0    0    0     0
id5  col1 col7 col8  0    0    0    0    0    0    0    0    0     0
id6  col4 col6 col9  0    0    0    0    0    0    0    0    0     0
id7  col5 col7 col10 0    0    0    0    0    0    0    0    0     0
id8  col2 col3 col6  0    0    0    0    0    0    0    0    0     0
id9  col5 col9 col10 0    0    0    0    0    0    0    0    0     0
id10 col4 col8 col9  0    0    0    0    0    0    0    0    0     0

Мне нужно получить базовый фрейм данных, показывающий 1, где в тегах появились значения столбцов (от col1 до col10):

id   tag1 tag2 tag3 col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
id1  col3 col4 col7  0    0    1    1    0    0    1    0    0     0
id2  col1 col2 col9  1    1    0    0    0    0    0    0    1     0
id3  col2 col5 col6  0    1    0    0    1    1    0    0    0     0
id4  col3 col6 col10 0    0    1    0    0    1    0    0    0     1
id5  col1 col7 col8  1    0    0    0    0    0    1    1    0     0
id6  col4 col6 col9  0    0    0    1    0    1    0    0    1     0
id7  col5 col7 col10 0    0    0    0    1    0    1    0    0     1
id8  col2 col3 col6  0    1    1    0    0    1    0    0    0     0
id9  col5 col9 col10 0    0    0    0    1    0    0    0    1     1
id10 col4 col8 col9  0    0    0    1    0    0    0    1    1     0

Я действительно не хочу использовать тройной l oop вроде:

cols = [el for el in df if el.startswith('col')]
tags = [el for el in df if el.startswith('tag')]

for index, row in df.iterrows(): 
   for col in cols: 
       for tag in tags:
           if row[tag] == col:
              row[col] +=1 

, но даже это пока не работает. Что было бы лучшим подходом и что не так наверху?

Большое спасибо!

1 Ответ

3 голосов
/ 03 марта 2020

Комбинация get_dummies и updat даст вам желаемое:

df.update(pd.get_dummies(df.filter(like='tag')
                           .stack()
                        ).sum(level=0)
          )

Вывод:

     id    tag1    tag2    tag3      col1    col2    col3    col4    col5    col6    col7    col8    col9    col10
--  ----  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  ------  -------
 0  id1   col3    col4    col7         0       0       1       1       0       0       1       0       0        0
 1  id2   col1    col2    col9         1       1       0       0       0       0       0       0       1        0
 2  id3   col2    col5    col6         0       1       0       0       1       1       0       0       0        0
 3  id4   col3    col6    col10        0       0       1       0       0       1       0       0       0        1
 4  id5   col1    col7    col8         1       0       0       0       0       0       1       1       0        0
 5  id6   col4    col6    col9         0       0       0       1       0       1       0       0       1        0
 6  id7   col5    col7    col10        0       0       0       0       1       0       1       0       0        1
 7  id8   col2    col3    col6         0       1       1       0       0       1       0       0       0        0
 8  id9   col5    col9    col10        0       0       0       0       1       0       0       0       1        1
 9  id10  col4    col8    col9         0       0       0       1       0       0       0       1       1        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...