Как изменить порядок столбцов на основе условия

#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)