Я задал связанный вопрос несколько дней назад ( Поэлементное деление на строки между датафреймом и серией ), но не хотел его редактировать, поскольку, хотя и связано, это новая задача.
Имея эти данные ( mydata.csv ):
>>> mydata = pd.read_csv("mydata.csv")
>>> mydata
date type id ... 1096 1097 1098
0 2014-06-13 cal 1 ... 17.949524 16.247619 15.465079
1 2014-06-13 cow 32 ... 0.523429 -0.854286 -1.520952
2 2014-06-13 cow 47 ... 7.676000 6.521714 5.892381
3 2014-06-13 cow 107 ... 4.161714 3.048571 2.419048
4 2014-06-13 cow 137 ... 3.781143 2.557143 1.931429
5 2014-06-13 dark 1 ... 168.725714 167.885715 167.600001
6 2014-10-24 cal 1 ... 14.137143 12.584000 11.876191
7 2014-10-24 cal 2 ... -3.980571 -5.753143 -6.504762
8 2014-10-24 cow 32 ... -18.670857 -20.433714 -21.246667
9 2014-10-24 cow 47 ... -20.106286 -21.812571 -22.526667
10 2014-10-24 cow 105 ... -12.625714 -14.267429 -14.946667
11 2014-10-24 cow 107 ... -15.352571 -16.901714 -17.652381
12 2014-10-24 cow 137 ... -20.389143 -22.345143 -23.168571
13 2014-10-24 dark 1 ... 172.965715 172.031429 171.780952
Я хочу сделать так, чтобы каждая строка с типом "cow"
была разделена на строкус type == "cal"
, но оба имеют одно и то же значение "date"
.Если на определенную дату существует более одной строки "cal"
, следует выбрать строку с более высоким id
.Для представленных данных строки 1-4 следует разделить строкой 0, а строки 8-12 - строкой 7. (столбец после идентификатора «188» - это то место, где начинаются числовые значения).Это должно быть результатом:
date type id ... 1096 1097 1098
1 2014-06-13 cow 32 ... 0.029161 -0.052579 -0.098348
2 2014-06-13 cow 47 ... 0.427644 0.401395 0.381012
3 2014-06-13 cow 107 ... 0.231857 0.187632 0.156420
4 2014-06-13 cow 137 ... 0.210654 0.157386 0.124890
8 2014-10-24 cow 32 ... 4.690497 3.551748 3.266325
9 2014-10-24 cow 47 ... 5.051105 3.791418 3.463104
10 2014-10-24 cow 105 ... 3.171835 2.479936 2.297804
11 2014-10-24 cow 107 ... 3.856876 2.937823 2.713763
12 2014-10-24 cow 137 ... 5.122165 3.883989 3.561786
Мне удалось выполнить итерацию по уникальным датам, затем отфильтровать и извлечь строки "cal" и строки "cow", разделить их и добавить каждый результат впустой DataFrame.Вот функция, которую я использовал:
def divide_cal_date(mydata):
cows = mydata[(mydata["type"] == "cow")]
div_cows = pd.DataFrame()
for i in mydata.date.unique():
curr_cal = mydata[(mydata["date"] == i) & (mydata["type"] == "cal")].tail(1).iloc[:,3:]
temp_cows = cows[(cows["date"] == i)].copy()
temp_cows.loc[:,3:] = cows[(cows["date"] == i)].iloc[:,3:].div(curr_cal.squeeze())
div_cows = div_cows.append(temp_cows)
print(i, end="\r")
print("end")
return div_cows
Как я уже говорил в моем предыдущем вопросе, я только начинаю с панд, поэтому мне интересно, есть ли более чистый, эффективный, прямой способ сделать это.Пока это работает, но любые предложения приветствуются.