Я предполагал, что это будет довольно просто, но, видимо, я что-то здесь упускаю.
Я хочу иметь возможность использовать np.where
с df.groupby('Name').apply()
для создания нового столбца в df
(назовите его 'New'
), где значения столбца 1
, если индексы соответствующих группа (индексы, соответствующие исходному df
) больше или равна (>=
) определенного значения, в противном случае 0
.
Для фона я группирую df
по столбцу 'Name'
, и у меня есть dict()
, который содержит соответствующее значение для использования для каждого имени из groupby()
. Я надеюсь, что это понятно, я могу дать дополнительные разъяснения, если это необходимо.
Вот то, что я имею до сих пор, данный пример df
:
df = pd.DataFrame([['William', 1, 0, 0, 0, 1],['James', 0, 1, 1, 1, 1],['James', 1, 0, 0, 0, 0],
['James', 1, 0, 1, 1, 0],['William', 0, 1, 1, 0, 1],['William', 0, 0, 0, 0, 0],
['William', 1, 0, 1, 1, 0],['James', 0, 1, 1, 0, 1],['James', 0, 0, 0, 0, 0]],
columns=['Name','x1','x2','x3','x4','Interest'])
Name x1 x2 x3 x4 Interest
0 William 1 0 0 0 1
1 James 0 1 1 1 1
2 James 1 0 0 0 0
3 James 1 0 1 1 0
4 William 0 1 1 0 1
5 William 0 0 0 0 0
6 William 1 0 1 1 0
7 James 0 1 1 0 1
8 James 0 0 0 0 0
Затем я нахожу последнюю строку в df
для каждой группы, где столбец 'Interest'
имеет 1
, используя:
mydict = df[df['Interest']==1].groupby('Name').apply(lambda x: x.index[-1]).to_dict()
{'James': 7, 'William': 4}
Примечание. Это упрощенный пример. Для моего реального приложения я вытягиваю указатель с 3-й по последнюю строку (т. Е. .apply(lambda x: x.index[-3]).to_dict()
), однако в следующей части находится корень моего вопроса.
Теперь я хочу создать новый столбец 'Name'
, где значение равно 1
, если индекс строки равен >=
, значение в mydict
для этой группы, иначе 0
. Я попробовал несколько вещей:
for key, val in mydict.items():
df['New'] = np.where((df['Name']==key) & (df.index>=val), 1, 0)
Это, очевидно, переопределит все, что сделано для 'James'
и просто вернет правильный столбец для 'William'
. Как я могу эффективно сделать это?
Если быть точным, вот мой ожидаемый результат:
Name x1 x2 x3 x4 Interest New
0 William 1 0 0 0 1 0
1 James 0 1 1 1 1 0
2 James 1 0 0 0 0 0
3 James 1 0 1 1 0 0
4 William 0 1 1 0 1 1
5 William 0 0 0 0 0 1
6 William 1 0 1 1 0 1
7 James 0 1 1 0 1 1
8 James 0 0 0 0 0 1