как добавить новый столбец на основе значения строки выше - PullRequest
0 голосов
/ 10 января 2019

У меня есть один кадр данных, как показано ниже. Во-первых, они имеют три столбца («дата», «время», «флаг»). Я хочу добавить один столбец, который основан на флаге и дате, что означает, что когда я получу флаг = 1, то до конца этого дня цель будет равна 1, в противном случае цель будет равна нулю.

  date        time      flag  target
0 2017/4/10   10:00:00  0     0
1 2017/4/10   11:00:00  1     1
2 2017/4/10   12:00:00  0     1
3 2017/4/10   13:00:00  0     1
4 2017/4/10   14:00:00  0     1
5 2017/4/11   10:00:00  1     1
6 2017/4/11   11:00:00  0     1
7 2017/4/11   12:00:00  1     1
8 2017/4/11   13:00:00  1     1
9 2017/4/11   14:00:00  0     1
10 2017/4/12  10:00:00  0     0
11 2017/4/12  11:00:00  0     0
12 2017/4/12  12:00:00  0     0
13 2017/4/12  13:00:00  0     0
14 2017/4/12  14:00:00  0     0
15 2017/4/13  10:00:00  0     0
16 2017/4/13  11:00:00  1     1
17 2017/4/13  12:00:00  0     1
18 2017/4/13  13:00:00  1     1
19 2017/4/13  14:00:00  0     1

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Хорошо, я знаю, что мы уже нашли решение здесь, но только для того, чтобы удовлетворить ботаника во мне, вот ответ (не элегантно, учитывая, как долго это), чтобы избежать этого ноющего недостатка первого ряда

pd.merge(df, (df.groupby('date')['flag'].any().astype(int)).to_frame().T.transpose().reset_index(), left_on='date', right_on='date')

Подход остается таким же, как у @jezrael - здесь функция groupby является ключевой. Вместо использования cumsum, которая приводит к недостатку первого ряда, any(), кажется, действительно хорошо вписывается в это решение. Единственным недостатком является то, что он создает серию, которую нам нужно затем вернуть обратно в кадр данных и транспонировать перед тем, как объединить их с помощью клавиши date .

0 голосов
/ 10 января 2019

Используйте DataFrameGroupBy.cumsum для совокупной суммы flag значений, сравните с 0 и последней приведенной маской для integer:

df['new'] = (df.groupby('date')['flag'].cumsum() > 0).astype(int)
print (df)
         date      time  flag  target  new
0   2017/4/10  10:00:00     0       0    0
1   2017/4/10  11:00:00     1       1    1
2   2017/4/10  12:00:00     0       1    1
3   2017/4/10  13:00:00     0       1    1
4   2017/4/10  14:00:00     0       1    1
5   2017/4/11  10:00:00     1       1    1
6   2017/4/11  11:00:00     0       1    1
7   2017/4/11  12:00:00     1       1    1
8   2017/4/11  13:00:00     1       1    1
9   2017/4/11  14:00:00     0       1    1
10  2017/4/12  10:00:00     0       0    0
11  2017/4/12  11:00:00     0       0    0
12  2017/4/12  12:00:00     0       0    0
13  2017/4/12  13:00:00     0       0    0
14  2017/4/12  14:00:00     0       0    0
15  2017/4/13  10:00:00     0       0    0
16  2017/4/13  11:00:00     1       1    1
17  2017/4/13  12:00:00     0       1    1
18  2017/4/13  13:00:00     1       1    1
19  2017/4/13  14:00:00     0       1    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...