Как создать динамический индекс во фрейме данных на основе каталога?

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

data = {'Req Type': ['A', 'B', 'C', 'D'], 'Req No': [20, 21, 19, 18]}
df1 = pd.DataFrame(data)
print(df1)
   Req Type  Req No
0         A      20
1         B      21
2         C      19
3         D      18

Другой — это фрейм данных о том, сколько новых запросов у меня есть в этом месяце.

data2 = {'Req Type': ['A', 'A', 'C', 'B']}
df2 = pd.DataFrame(data2)
print(df2)
   Req Type
0         A
1         A
2         C
3         B

Мне нужно создать динамический индекс в моем df2, который может определить последнее число каждого типа запроса и начать суммировать. Пример: последнее число A было «20», поэтому индекс для типа запроса «A» равен «21», затем «22», и это для всех моих типов запросов.

   Req Type  Index
0         A     21
1         A     22
2         C     20
3         B     22

Почему индекс B равен 12?

MatBailie 08.07.2024 23:26

Извините, это была моя ошибка, индекс B должен быть 22.

Amaury Pedraza 08.07.2024 23:30

Что вы подразумеваете под «последним номером каждого типа запроса»? В этих данных для каждого типа запроса имеется только одно число.

wjandrea 09.07.2024 01:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать словарь и обновлять его за один проход:

def get_indices(df1, df2):
    tn = df1.set_index('Req Type')['Req No']
    res = []
    for t in df2['Req Type']:
        tn[t] += 1
        res.append(tn[t])
    return res


print(df2.assign(Index=get_indices(df1, df2)))

Распечатки:

  Req Type  Index
0        A     21
1        A     22
2        C     20
3        B     22

Спасибо!!! Братан, это было очень полезно для меня, ты козел, M10 CR7, Король, хаха.

Amaury Pedraza 09.07.2024 04:02

@Amaury другое решение намного лучше

mozway 09.07.2024 06:52

Если я правильно понимаю, вы хотите объединить, то добавьте групповое перечисление плюс 1.

df2.assign(
    Index=df2.merge(df1)['Req No'] + df2.groupby('Req Type').cumcount() + 1)
  Req Type  Index
0        A     21
1        A     22
2        C     20
3        B     22

Обновлено: я только что заметил в вопросе «последний номер каждого типа запроса». На самом деле это не имеет значения для этих данных, поэтому, вероятно, я не заметил этого раньше. Если это важно, замените df1 в приведенном выше коде на df1.drop_duplicates('Req Type', keep='last').

Вот еще одна реализация:

data = {'Req Type': ['A', 'B', 'C', 'D'],'Req No': [20, 21, 19, 18]}
data2 = {'Req Type': ['A', 'A', 'C', 'B']}

def updateIndex(dict1, dict2):
    df1 = pd.DataFrame(dict1)

    # gets max 'Req No' value for each unique 'Req Type' -> df['Req Type'] = max('Req No') for that 'Req Type'
    df1_key_max = {key:max(df1[df1['Req Type']==key]['Req No']) for key in df1['Req Type'].unique()}

    # creates a new list, where the items will be the 'Req No' updated
    req_no = list()
    for req_type in dict2['Req Type']:
        df1_key_max[req_type] += 1
        req_no.append(df1_key_max[req_type])

    # creates new Df with updated values
    data2['Req No'] = req_no
    df2 = pd.DataFrame(data2)
    return df2
updateIndex(data, data2)

Каждый шаг для лучшего понимания:

-Создает Дикт

# gets max 'Req No' value for each unique 'Req Type' -> df['Req Type'] = max('Req No') for that 'Req Type'
df1_key_max = {key:max(df1[df1['Req Type']==key]['Req No']) for key in df1['Req Type'].unique()}
print(df1_key_max)

>>>{'A': 20, 'B': 21, 'C': 19, 'D': 18}

-Создает список с обновленным индексом

# creates a new list, where the items will be the 'Req No' updated
req_no = list()
for req_type in dict2['Req Type']:
    df1_key_max[req_type] += 1
    req_no.append(df1_key_max[req_type])
    print(req_no)

(each iteration of req_no)
>>>[21]
>>>[21, 22]
>>>[21, 22, 20]
>>>[21, 22, 20, 22]

Затем просто верните новый df.

Ты новичок в Пандах, да? df1_key_max можно создать намного проще, используя идиомы Pandas: df1.groupby('Req Type')['Req No'].max()

wjandrea 09.07.2024 00:59

Почему вы создаете новые фреймы данных, а не просто используете те, которые указаны в вопросе?

wjandrea 09.07.2024 01:03

да, я новенький. Просто пытаюсь помочь. Извини

Pedro 09.07.2024 02:47

Другие вопросы по теме