#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