У меня есть Dataframe df и список li. Мой столбец dataframe содержит:
Student Score Date
A 10 15-03-19
C 11 16-03-19
A 12 16-03-19
B 10 16-03-19
A 9 17-03-19
Мой список содержит имена всех учеников li=[A,B,C] Если какой-либо студент не пришел в определенный день, вставьте имя студента в фрейм данных со значением оценки = 0.
Мой окончательный фрейм данных должен быть таким:
Student Score Date
A 10 15-03-19
B 0 15-03-19
C 0 15-03-19
C 11 16-03-19
A 12 16-03-19
B 10 16-03-19
A 9 17-03-19
B 0 17-03-19
C 0 17-03-19
Используйте DataFrame.reindex
с MultiIndex.from_product
:
li = list('ABC')
mux = pd.MultiIndex.from_product([df['Date'].unique(), li], names=['Date', 'Student'])
df = df.set_index(['Date', 'Student']).reindex(mux, fill_value=0).reset_index()
print (df)
Date Student Score
0 15-03-19 A 10
1 15-03-19 B 0
2 15-03-19 C 0
3 16-03-19 A 12
4 16-03-19 B 10
5 16-03-19 C 11
6 17-03-19 A 9
7 17-03-19 B 0
8 17-03-19 C 0
Альтернативой является использование левого соединения с DataFrame.merge
и вспомогательным DataFrame, созданным product
, последнее заменяет отсутствующие значения на fillna
:
from itertools import product
df1 = pd.DataFrame(list(product(df['Date'].unique(), li)), columns=['Date', 'Student'])
df = df1.merge(df, how='left').fillna(0)
print (df)
Date Student Score
0 15-03-19 A 10.0
1 15-03-19 B 0.0
2 15-03-19 C 0.0
3 16-03-19 A 12.0
4 16-03-19 B 10.0
5 16-03-19 C 11.0
6 17-03-19 A 9.0
7 17-03-19 B 0.0
8 17-03-19 C 0.0
@souravkhanna - Точно, первое решение работает только для уникальных значений в index. Поэтому, пожалуйста, используйте второе решение.
Ваша альтернатива работает нормально, но первое решение выдает ошибку: Исключение: невозможно обработать неуникальный мультииндекс!