отличных ответов.У меня была другая идея, потому что она больше подходит к проблеме, с которой я имею дело, используя внешнее соединение и pd.merge
.В дополнение к примеру, приведенному выше, у меня есть несколько метрических столбцов (в этом примере m1 и m2), которые я хочу установить в ноль для каждой группы, которая не содержит этих значений Rank.в моем случае Ранг - это просто измерение времени, и я df содержит временные ряды по нескольким идентификаторам.
df = pd.read_csv(pd.compat.StringIO("""Rank ID m1 m2
0 1 a 1 3
1 2 a 2 3
2 3 a 1 2
3 4 a 1 3
4 5 a 2 3
6 1 c 2 2
7 2 c 2 4
8 1 e 1 3
9 2 e 1 4
10 3 e 1 2"""), sep=r' +')
Затем я определяю df, содержащий все ранги, в этом примере от 1 до 10.
df_outer_right = pd.DataFrame({'Rank':np.arange(1,11,1)})
наконец, я группирую начальный df по ID и применяю внешнее объединение, используя pd.merge для каждой группы.
df.groupby('ID').apply(lambda df: pd.merge(df, df_outer_right, how='outer', on='Rank'))
, что приводит к:
ID Rank ID m1 m2
a 0 1 a 1.0 3.0
a 1 2 a 2.0 3.0
a 2 3 a 1.0 2.0
a 3 4 a 1.0 3.0
a 4 5 a 2.0 3.0
a 5 6 NaN NaN NaN
a 6 7 NaN NaN NaN
a 7 8 NaN NaN NaN
a 8 9 NaN NaN NaN
a 9 10 NaN NaN NaN
c 0 1 c 2.0 2.0
c 1 2 c 2.0 4.0
c 2 3 NaN NaN NaN
c 3 4 NaN NaN NaN
c 4 5 NaN NaN NaN
c 5 6 NaN NaN NaN
c 6 7 NaN NaN NaN
c 7 8 NaN NaN NaN
c 8 9 NaN NaN NaN
c 9 10 NaN NaN NaN
e 0 1 e 1.0 3.0
e 1 2 e 1.0 4.0
e 2 3 e 1.0 2.0
e 3 4 NaN NaN NaN
e 4 5 NaN NaN NaN
e 5 6 NaN NaN NaN
e 6 7 NaN NaN NaN
e 7 8 NaN NaN NaN
e 8 9 NaN NaN NaN
e 9 10 NaN NaN NaN
Я уверен, что это может быть не самое быстрое решение:)