Добавить последовательный счетчик для группы в пределах кадра данных, но пропустить приращение, когда условие выполнено - PullRequest
1 голос
/ 01 апреля 2020

Я хочу установить инкрементный счетчик с группой в кадре данных. Я хотел бы увеличить счетчик для каждой строки в группе, если не выполняется условие. Если условие выполнено, я хочу использовать предыдущий счет. Я также хочу, чтобы это сбрасывалось для каждой группы.

пример:

d1 = {'col1': [1, 1, 1, 2, 2, 3], 'col2': ['A', 'A', 'B', 'A', 'A', 'B']}
df1 = pd.DataFrame(data=d1)
df1

вывод:

   col1 col2
0   1   A
1   1   A
2   1   B
3   2   A
4   2   A
5   3   B

ожидаемый вывод:

  col1 col2 count
0   1   A   1
1   1   A   2
2   1   B   2
3   2   A   1
4   2   A   2
5   3   B   0

Я пытался использовать numpy Cumsum. Но я не совсем уверен, как повторно использовать последний cumsum

Редактировать: Глядя для группировки по столбцу 1.

1 Ответ

0 голосов
/ 01 апреля 2020

Я сделал фрагмент кода, следуя тому, что, как я считаю, является тем, что вы хотите, вы можете определенно использовать повторно, чтобы приспособиться, если что-то не совсем так, как вы ожидали.

Я думаю, что ключевым моментом здесь является: 1) итерация на пары (previousRow, currentRow), чтобы вы могли легко получить доступ к информации о последней строке

2), указав c, если условия, которые соответствуют вашим ожиданиям.

3), попробуйте обновить счетчик в условиях if и установите значение впоследствии

import pandas as pd
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
from itertools import zip_longest
d1 = {'col1': [1, 1, 1, 2, 2, 3], 'col2': ['A', 'A', 'B', 'A', 'A', 'B']}
df1 = pd.DataFrame(data=d1)

df1['count'] = 0
df1_previterrows = df1.iterrows()
df1_curriterrows = df1.iterrows()
df1_curriterrows.__next__()

groups_counter = {}

df1_firstRow = df1.iloc[0]
if df1_firstRow["col2"] == "A":
    groups_counter[df1_firstRow['col1']]=1
    df1.set_value(0, 'count', 1)
elif df1_firstRow["col2"] == "B":
    groups_counter["B"]=1
    df1.set_value(0, 'count', 0)

zip_list = zip_longest(df1_previterrows, df1_curriterrows) 
for (prevRow_idx, prevRow), Curr  in zip_list:
    if not (Curr is None):
        (currRow_idx, currRow) = Curr
        if((currRow["col1"] == prevRow["col1"]) and (currRow["col2"] == "A")):
            count = groups_counter.get(currRow["col1"],False)
            if not count:
                groups_counter[currRow["col1"]]=0
            groups_counter[currRow["col1"]]+=1

        elif((currRow["col1"] != prevRow["col1"]) and (currRow["col2"] == "A")):
            groups_counter[currRow["col1"]]=1

        elif((currRow["col1"] == prevRow["col1"]) and (currRow["col2"] == "B")):
            if not groups_counter.get(currRow["col1"],False):
                groups_counter[curr["col1"]] = 1

        elif((currRow["col1"] != prevRow["col1"]) and (currRow["col2"] == "B")):
            groups_counter[currRow["col1"]]=0
        df1.set_value(currRow_idx, 'count', groups_counter[currRow["col1"]])
print(df1)

ВЫХОД:

   col1 col2  count
0     1    A      1
1     1    A      2
2     1    B      2
3     2    A      1
4     2    A      2
5     3    B      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...