Python - добавление номера строки с обратным счетчиком - PullRequest
0 голосов
/ 23 октября 2018

У меня есть еще один вопрос по Python.Это, вероятно, может быть достигнуто с помощью цикла, однако я искал более гибкое решение

Предположим, у меня есть кадр данных, подобный этому:

enter image description here

Я ищу код для генерации идентификатора столбца, который является не более чем нисходящим счетчиком, когда изменяется значение в столбце Продано, т. Е. Для каждого Продавца я хотел бы, чтобы столбец идентификатора извлекалколичество дней, оставшихся до изменения проданной стоимости.Например, в день 01.01.2008 у продавца Джо будет ID = 2, потому что сигнал меняется через 2 дня.

Есть идеи, как решить этот вопрос?

Большое спасибо,J

1 Ответ

0 голосов
/ 23 октября 2018

Настройка:

df = pd.DataFrame([
    pd.Series(pd.date_range('1/1/2018', '1/7/2018').append(pd.date_range('1/1/2018', '1/7/2018'))),
    pd.Series(['Joe']*7 + ['Helen']*7),
    pd.Series([1,1,0,0,0,0,1,0,1,1,0,1,0,0]),
]).T
df.columns = ['date', 'salesman', 'sold']
df['date'] = pd.to_datetime(df['date'])

Вычисления:

df['changes'] = df.groupby('salesman')['sold'].expanding().apply(lambda x: (np.diff(x) != 0).sum()).reset_index(drop = True)

df['id'] = df.groupby(['salesman', 'changes']).apply(lambda grp: pd.Series(len(grp) - grp.sort_values('date').reset_index().index)).reset_index(drop = True)

df.drop('changes', axis = 1, inplace = True)

Результаты:

>>> df


    date    salesman  sold  id
0   2018-01-01  Joe     1   2
1   2018-01-02  Joe     1   1
2   2018-01-03  Joe     0   4
3   2018-01-04  Joe     0   3
4   2018-01-05  Joe     0   2
5   2018-01-06  Joe     0   1
6   2018-01-07  Joe     1   1
7   2018-01-01  Helen   0   1
8   2018-01-02  Helen   1   2
9   2018-01-03  Helen   1   1
10  2018-01-04  Helen   0   1
11  2018-01-05  Helen   1   1
12  2018-01-06  Helen   0   2
13  2018-01-07  Helen   0   1

Объяснение:

создать столбец 'changes'это увеличивает каждый раз, когда изменяется поле 'sold 'отдельного продавца.Затем для каждой группы приращений (все еще сгруппированной по продавцу), получите длину этой группы (которая равна тому, как существуют последующие строки этого значения) и вычтите из этого значения индекс каждой строки, отсортированный по дате.Результатом этого вычитания будет последовательность, которая уменьшается от длины группы до 1. Сбросьте индекс и вернитесь к исходному фрейму данных.Это немного запутанное решение, но оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...