У меня есть два разных фрейма данных. Первый — это каталог запросов разных типов и количества запросов, которые у меня были на данный момент.
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 должен быть 22.
Что вы подразумеваете под «последним номером каждого типа запроса»? В этих данных для каждого типа запроса имеется только одно число.
Вы можете использовать словарь и обновлять его за один проход:
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 другое решение намного лучше
Если я правильно понимаю, вы хотите объединить, то добавьте групповое перечисление плюс 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()
Почему вы создаете новые фреймы данных, а не просто используете те, которые указаны в вопросе?
да, я новенький. Просто пытаюсь помочь. Извини
Почему индекс B равен 12?