#python #pandas #dataframe
#python #панды #фрейм данных
Вопрос:
Я новичок в программировании. Я изучаю python и pandas из Интернета.
Я работаю в качестве QA и пытаюсь автоматизировать одну из моих ручных работ.
У меня есть 2 набора данных.
df1= pd.DataFrame({'number':['c-101','c-102','c-103'],'Summary':['Summary1','Summary2','Summary3']})
df2= pd.DataFrame({'ticket':['c-102','c-103','c-101'],'Summary':['Ticket1','Ticket2','Ticket3'], 'Priority':['High','Low','High']})
df2.ticket
содержит аналогичные значения, df1.numbers
но они перемешаны.
df2
и df1
имеют разную длину с len(df1)
> len(df2)
Я пытаюсь создать новый фрейм данных (df3), где :
- if
df1.number
=df2.ticket exist
: Обновите df3 всеми значениями в df1 (строка), соответствующими df2.Priority (в новом столбце) - если
df1.number = df2.ticket
не существует: Обновить"NO PRIORITY"
Поэтому мне нужно выполнить цикл, df1.number
чтобы проверить df2.ticket
, существует ли каждый из них.
Я пытался:
for i in df2["ticket"]:
if i in df1["number"]:
ticket.append(df2["Priority"])
else:
ticket.append("NOT CREATED")
Вывод: df3 содержит все строки с приоритетом = «НЕ СОЗДАНО» (даже для df1.number
= df2.ticket
)
Действительно ценю любой вклад сообщества.
Ответ №1:
Вы можете использовать merge
, join
или pd.concat
для этого:
Входные данные:
>>> print(df1)
number Summary
0 c-101 Summary1
1 c-102 Summary2
2 c-103 Summary3
3 c-104 Summary4
>>> print(df2)
ticket Summary Priority
0 c-102 Ticket1 High
1 c-103 Ticket2 Low
2 c-101 Ticket3 High
Фрейм merge
данных:
>>> df3 = df1.merge(df2, how='outer', left_on='number', right_on='ticket')
>>> df3['Priority'].fillna("NOT CREATED",inplace=True)
Фрейм join
данных:
>>> df3 = df1.join(df2, how='outer', lsuffix='number',rsuffix='ticket')
>>> df3['Priority'] = df3['Priority'].fillna("NOT CREATED")
Вывод в любом случае:
>>> print(df3)
number Summary_x ticket Summary_y Priority
0 c-101 Summary1 c-101 Ticket3 High
1 c-102 Summary2 c-102 Ticket1 High
2 c-103 Summary3 c-103 Ticket2 Low
3 c-104 Summary4 NaN NaN NOT CREATED
pd.concat
:
>>> df3 = pd.concat([df1.set_index('number'),df2.set_index('ticket')],axis=1)
>>> df3['Priority'] = df3['Priority'].fillna("NOT CREATED")
>>> df3
Summary Summary Priority
c-101 Summary1 Ticket3 High
c-102 Summary2 Ticket1 High
c-103 Summary3 Ticket2 Low
c-104 Summary4 NaN NOT CREATED
Ответ №2:
Если я правильно понял вашу проблему, это должно выполнить эту работу :
df3 = pd.merge(df1, df2, how='left', left_on='number', 'right_on'='ticket')
df3['Priority'].fillna('NO PRIORITY', inplace=True)