Деление на строки между частью кадра данных и выбранной строкой - PullRequest
0 голосов
/ 06 февраля 2019

Я задал связанный вопрос несколько дней назад ( Поэлементное деление на строки между датафреймом и серией ), но не хотел его редактировать, поскольку, хотя и связано, это новая задача.

Имея эти данные ( 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

Как я уже говорил в моем предыдущем вопросе, я только начинаю с панд, поэтому мне интересно, есть ли более чистый, эффективный, прямой способ сделать это.Пока это работает, но любые предложения приветствуются.

...