У меня есть образец DF, я пытаюсь заменить список значений столбца индексом с сортировкой по возрастанию:
DF:
df = pd.DataFrame(np.random.randint(0,10,size=(7,3)),columns=["a","b","c"])
df["d1"]=["Apple","Mango","Apple","Mango","Mango","Mango","Apple"]
df["d2"]=["Orange","lemon","lemon","Orange","lemon","Orange","lemon"]
df["date"] = ["2002-01-01","2002-01-01","2002-01-01","2002-01-01","2002-02-01","2002-02-01","2002-02-01"]
df["date"] = pd.to_datetime(df["date"])
a b c d1 d2 date
0 2 7 9 Apple Orange 2002-01-01
1 6 0 9 Mango lemon 2002-01-01
2 8 0 0 Apple lemon 2002-01-01
3 4 4 4 Mango Orange 2002-01-01
4 5 0 8 Mango lemon 2002-02-01
5 6 1 6 Mango Orange 2002-02-01
6 7 2 7 Apple lemon 2002-02-01
Шаг 1:
Group the DF by "date" column, sample group on "2002-01-01"
a b c d1 d2 date
0 2 7 9 Apple Orange 2002-01-01
1 6 0 9 Mango lemon 2002-01-01
2 8 0 0 Apple lemon 2002-01-01
3 4 4 4 Mango Orange 2002-01-01
Шаг 2:
В этой группе замените значения столбцов ["d1","d2"]
индексом (не индексом DF) отсортированных средних значений на основе c
.
Например, в над группой mean(c, d1="Apple") = [9+0]/2 => 4.5
и mean(c, d1="Mango") = [9+4]/2 => 6.5
, поэтому ascending sorted index
равно Apple:0
и Mango:1
, поэтому значение столбца d1
будет заменено следующим образом:
a b c d1 d2 date
0 2 7 9 0 Orange 2002-01-01
1 6 0 9 1 lemon 2002-01-01
2 8 0 0 0 lemon 2002-01-01
3 4 4 4 1 Orange 2002-01-01
Примените это для всего df
. У меня есть метод грубой силы перебора групп и каждой строки, любые предложения для решения на основе более pandas
будут полезны для повышения эффективности.