Итерация по двум переменным в Pandas Dataframe - PullRequest
2 голосов
/ 06 октября 2019

Предположим, у меня есть следующий фрейм данных:

CategoryID    Days   Views
    a          1      19
    a          2     2000
    a          5     5667
    a          7     7899
    b          1      2
    b          3     245
    c          1      1
    c          2     252
    c          7     2657

Учитывая threshold = n, я хочу создать два списка и буду добавлять их, пока не достигну порога + 1 элемент для каждой категории.

Итак, если n < 4, я ожидаю для категории a:

days_list = [1,2,5]
views_list = [19, 2000, 5667]

После этого я хочу применить функцию в этих списках и затем запустить итерацию в следующемкатегория. Однако я сталкиваюсь с двумя проблемами со следующим кодом:

  1. Я не могу выполнить итерацию правильно, когда i == 0
  2. Итерация не переходит к следующей категории.
df['interpolated'] = int
days_list = []
views_list = []



for i,post in enumerate(category):
    if df['category_id'].iloc[i-1] != post:
            days_list.append(df['days new'].iloc[i])
            views_list.append(df['views'].iloc[i])
    elif df['category_id'].iloc[i] == post and df[category_id].iloc[i-1] == post:
        if df['days new'].iloc[i] < 3:
            days_list.append(df['days new'].iloc[i])
            views_list.append(df['views'].iloc[i])
        elif df['days new'].iloc[i] != 3:
            days_list.append(df['days new'].iloc[i])
            views_list.append(df['views'].iloc[i])
            break
        # Calculate the interpolation
        interpolator = log_interp1d(days_list,views_list)
        df['interpolated'] = round(interpolator(4).astype(int))
    # Reset the lists after the category loop
    days_list = [] 
    views_list = []

Может кто-нибудь дать мне немного света? Спасибо!

1 Ответ

0 голосов
/ 06 октября 2019

Вы можете использовать операцию типа row_number.

....
df['row_number'] = df.groupby(['CategoryId']).cumcount+1

Затем у вас будет фрейм данных

CategoryID    Days   Views  row_number
    a          1      19        1
    a          2     2000       2
    a          5     5667       3
    a          7     7899       4
    b          1      2         1
    b          3     245        2
    c          1      1         1
    c          2     252        2
    c          7     2657       3

Затем вы сможете использовать булеву фильтрацию, чтобы получить то, что вы хотите. Так что для вашего примера,

df_category_a_filtered_4 = df[(df['row_number'] == 3]) & (df['CategoryID'] == 'a')]

, который отфильтрует ваш фрейм данных так, что два списка, которые вы хотите, - это два столбца. Это может функционировать, очевидно, чтобы делать все, что вам нужно.

Если вы хотите более конкретный вывод, укажите, как это будет выглядеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...