добавить новый столбец на основе нескольких строк с одинаковой датой

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

2
задан GeekSambhu 17 January 2019 в 08:29
поделиться

4 ответа

Онлайн:

# Assuming your `df` doesn't have target in the first place
df['target'] = 0
df.loc[df[df.flag==1].drop_duplicates('date').index, 'target'] = 1
0
ответ дан Chris 17 January 2019 в 08:29
поделиться

Это легко понять и использовать ответ:

m=f[['date','flag']]
i=m[m.flag==1].drop_duplicates().index
f['target']=0
f['target'].iloc[i]=1
print(f.drop(columns={'index'})

Вывод:

         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       0
3   2017/4/10  13:00:00     0       0
4   2017/4/10  14:00:00     0       0
5   2017/4/11  10:00:00     1       1
6   2017/4/11  11:00:00     0       0
7   2017/4/11  12:00:00     1       0
8   2017/4/11  13:00:00     1       0
9   2017/4/11  14:00:00     0       0
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       0
18  2017/4/13  13:00:00     1       0
19  2017/4/13  14:00:00     0       0
0
ответ дан Amit Amola 17 January 2019 в 08:29
поделиться

Сначала выберите верхнюю первую запись с флагом = 1 для каждой даты и установите цель на 1

df1 = df[df.flag==1].groupby("date").head(1);
df1.target = 1

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

df.target = 0
df.update(df1.target)
0
ответ дан Sunil Goyal 17 January 2019 в 08:29
поделиться

Сравните DataFrameGroupBy.cumsum по 1 и цепочку кодирования сравните flag по 1 с bitwise AND и преобразовать в целое число:

df['target1'] = (df.groupby('date')['flag'].cumsum().eq(1) & df['flag'].eq(1)).astype(int)
         date      time  flag  target  target1
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       0        0
3   2017/4/10  13:00:00     0       0        0
4   2017/4/10  14:00:00     0       0        0
5   2017/4/11  10:00:00     1       1        1
6   2017/4/11  11:00:00     0       0        0
7   2017/4/11  12:00:00     1       0        0
8   2017/4/11  13:00:00     1       0        0
9   2017/4/11  14:00:00     0       0        0
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       0        0
18  2017/4/13  13:00:00     1       0        0
19  2017/4/13  14:00:00     0       0        0

Другое решение: [ 119]

df['target1'] = ((~df.loc[df['flag']==1, 'date'].duplicated())
                     .reindex(df.index, fill_value=False).astype(int))
0
ответ дан jezrael 17 January 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: