Вставить соответствующий список в соответствующие дублированные строки

#python #pandas #database #duplicates #row

#python #панды #База данных #дубликаты #строка

Вопрос:

Я создал два списка :

 list_1 = [a,b,c,d]
list_2 = [1,2,3,4]
  

И я также создал фрейм данных :

 Day   Subject
Day1  
Day2
Day3
  

Затем я продублировал строку, используя df = df.loc[df.index.repeat(3)] так, чтобы она повторялась много раз для каждого отдельного дня

 Day   Subject 
Day1
Day1
Day1
Day2
Day2
Day2
Day3
Day3
Day3
Day1
...
  

Я хотел бы вставить list_1 в первое вхождение каждого ‘Day1’ и list_2 в ‘Day2’, чтобы результат был таким

 Day   Subject 
Day1  a
Day1
Day1
Day2  1
Day2
Day2
Day3
Day3
Day3
Day1  a
...
  

Я думаю об использовании

 for i in range(0, df.shape[0]-1):
if df.iloc[i, 1] == 'Day1':
    df.iloc[i, 2] = list_1[0]
  

но он проходит через все Day1s.
Есть ли какой-либо способ сделать это? Большое спасибо!

Комментарии:

1. Куда пойдут b, c, d и 2,3,4?

2. они перейдут ко второму элементу дня 1 и дня 2 соответственно.

Ответ №1:

Используйте ne-shift трюк, чтобы найти местоположение первых «дней» в последовательной последовательности и заполнить свои значения в эти совпадающие дни.

 # sample dataset
days = np.tile(np.array(["Day1","Day2","Day3"]).repeat(3), 2)
df = pd.DataFrame(days, columns=["Day"])

# mark the first consecutive days
df["first"] = df["Day"].ne(df["Day"].shift())
# fill in the values
df["Subject"] = None
df.loc[df["first"] amp; (df["Day"] == "Day1"), "Subject"] = "a"
df.loc[df["first"] amp; (df["Day"] == "Day2"), "Subject"] = 1
  

Вывод

 df
Out[2]: 
     Day  first Subject
0   Day1   True       a
1   Day1  False    None
2   Day1  False    None
3   Day2   True       1
4   Day2  False    None
5   Day2  False    None
6   Day3   True    None
7   Day3  False    None
8   Day3  False    None
9   Day1   True       a
10  Day1  False    None
11  Day1  False    None
12  Day2   True       1
13  Day2  False    None
14  Day2  False    None
15  Day3   True    None
16  Day3  False    None
17  Day3  False    None