Проблемы при создании двухколоночного индекса в новом столбце панд? - PullRequest
0 голосов
/ 08 ноября 2018

С учетом следующего кадра данных:

col_1   col_2
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   1
False   2
True    2
False   2
False   2
True    2
False   2
False   2
False   2
False   2
False   2
False   2
False   2
False   2
False   2
False   2
False   2

Как я могу создать новый индекс, который поможет определить, когда значение True присутствует в col_1? То есть, когда в первом столбце появляется значение True, я хотел бы заполнить в обратном направлении числом, начинающимся с одного нового столбца. Например, это ожидаемый вывод для указанного выше кадра данных:

   col_1  col_2 new_id
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   1   1
    False   2   1
    True    2   1   --------- ^ (fill with 1 and increase the counter)
    False   2   2
    False   2   2
    True    2   2   --------- ^ (fill with 2 and increase the counter)
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    False   2   3
    True    2   4   --------- ^ (fill with 3 and increase the counter)

Проблема в том, что я не знаю, как создать идентификатор, хотя я знаю, что панды предоставляют объект bfill, который может помочь в достижении этой цели. До сих пор я пытался перебрать простой цикл for:

count = 0
for index, row in df.iterrows():
    if row['col_1'] == False:
        print(count+1)
    else:
        print(row['col_2'] + 1)

Однако я не знаю, как увеличить счетчик до следующего числа. Также я попытался создать функцию и затем применить ее к фрейму данных:

def create_id(col_1, col_2):
    counter = 0
    if col_1 == True and col_2.bool() == True:
        return counter + 1
    else:
        pass

Тем не менее, я теряю контроль над заполнением обратной колонки.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Если вы хотите добавить столбец new_id к вашему фрейму данных:

new_id=[]
counter=1
for index, row in df.iterrows():
    new_id+= [counter]
    if row['col_1']==True:
        counter+=1   
df['new_id']=new_id
0 голосов
/ 08 ноября 2018

Просто сделай с cumsum

df['new_id']=(df.col_1.cumsum().shift().fillna(0)+1).astype(int)
df
Out[210]: 
    col_1  col_2  new_id
0   False      1       1
1   False      1       1
2   False      1       1
3   False      1       1
4   False      1       1
5   False      1       1
6   False      1       1
7   False      1       1
8   False      1       1
9   False      1       1
10  False      1       1
11  False      1       1
12  False      1       1
13  False      1       1
14  False      2       1
15   True      2       1
16  False      2       2
17  False      2       2
18   True      2       2
19  False      2       3
20  False      2       3
21  False      2       3
22  False      2       3
23  False      2       3
24  False      2       3
25  False      2       3
26  False      2       3
27  False      2       3
28  False      2       3
29  False      2       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...