Есть ли способ выполнить цикл по фрейму данных и присвоить значение в новом столбце на основе списка?

#python #pandas #list #dataframe

#python #панды #Список #фрейм данных #pandas

Вопрос:

У меня есть один фрейм данных с 2 столбцами, и я хочу добавить новый столбец;

Этот новый столбец должен быть обновлен на основе списка, который у меня есть:

 list = [0,1,2,3,6,7,9,10]
  

Новый столбец обновляется значением списка, только если флаг (в col2) равен 1.
Если флаг равен 0, не заполняйте строку в новом столбце.

Текущий DF

  ------------- --------- 
| context     | flag    |
 ------------- --------- 
| 0           |       1 |
| 0           |       1 |
| 0           |       0 |
| 2           |       1 |
| 2           |       1 |
| 2           |       1 |
| 2           |       1 |
| 2           |       0 |
| 4           |       1 |
| 4           |       1 |
| 4           |       0 |
 ------------- --------- 
  

Желаемый DF

  ------------- --------- ------------- 
| context     | flag    | new_context |
 ------------- --------- ------------- 
| 0           |       1 |           0 |
| 0           |       1 |           1 |
| 0           |       0 |             |
| 2           |       1 |           2 |
| 2           |       1 |           3 |
| 2           |       1 |           6 |
| 2           |       1 |           7 |
| 2           |       0 |             |
| 4           |       1 |           9 |
| 4           |       1 |          10 |
| 4           |       0 |             |
 ------------- --------- ------------- 
  

Прямо сейчас я перебираю индексы списка и присваиваю значение списка столбцу new_context. Затем я увеличиваю, чтобы просмотреть список.
Значения заполняются в правильных местах, но все они говорят 0. Я не верю, что он выполняет итерацию по списку должным образом.

 list_length = len(list)
i=0
for i in range(list_length])):  
    df["new_context"] = [list[i] if ele == 0 else "" for ele in df["flag"]]
    if df["flag"] == 0: i =1
  

Я также попытался выполнить итерацию по всему фрейму данных, однако я думаю, что это просто применение одного и того же значения списка (первое значение списка равно 0)

 i=0
for index, row in df.iterrows():
    df["new_context"] = [list[i] if ele == 0 else "" for ele in df["flag"]]
    if row['flag'] == 0: i =1
  

Как я могу использовать следующее значение списка для заполнения нового столбца, где флаг = 1?
Кажется, i = 1 не работает.

Ответ №1:

Давайте попробуем

 l = [0,1,2,3,6,7,9,10]
df['New']=''
df.loc[df.flag==1,'New']=l
df
Out[80]: 
    context  flag New
0         0     1   0
1         0     1   1
2         0     0    
3         2     1   2
4         2     1   3
5         2     1   6
6         2     1   7
7         2     0    
8         4     1   9
9         4     1  10
10        4     0    
  

Комментарии:

1. Спасибо! сработало как по волшебству. Не знал, как использовать df.loc в pandas.