Соединение с фреймом данных Python выберите, где не существует

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть 2 фрейма данных ниже, я хотел бы установить значение NxtCase

 dfObj = pd.DataFrame(columns=['ID', 'Case','NxtCase']) 
dfObj = dfObj.append({'ID': 11234, 'Case': 'A', 'NxtCase': ''}, ignore_index=True) 
dfObj = dfObj.append({'ID': 2347, 'Case': 'C', 'NxtCase': ''}, ignore_index=True) 
dfObj = dfObj.append({'ID': 31278, 'Case': 'E', 'NxtCase': ''}, ignore_index=True) 

dfObj2 = pd.DataFrame(columns=['ID', 'Case']) 
dfObj2 = dfObj2.append({'ID': 11234, 'Case': 'A' }, ignore_index=True) 
dfObj2 = dfObj2.append({'ID': 11234, 'Case': 'B'}, ignore_index=True) 
dfObj2 = dfObj2.append({'ID': 2347, 'Case': 'C'}, ignore_index=True) 
dfObj2 = dfObj2.append({'ID': 2347, 'Case': 'D'}, ignore_index=True) 
dfObj2 = dfObj2.append({'ID': 31278, 'Case': 'E'}, ignore_index=True) 
dfObj2 = dfObj2.append({'ID': 31278, 'Case': 'F'}, ignore_index=True)

print(dfObj)
print(dfObj2)
  

Моя цель — сравнить dfObj с dfObj2 и установить значение NxtCase.

Значение NxtCase должно равняться отсутствующему регистру букв на основе идентификатора, а не тому, что в настоящее время существует в столбце Case.

Например, ID = 1 и Case = ‘A’, затем значение NxtCase = ‘B’ Есть идеи о том, как я могу установить это значение?

например, вот пример того, что у меня есть

  ID Case NxtCase
 11234    A        
 2347     C        
 31278    E      
  

Это мой желаемый результат

  ID Case NxtCase
 11234    A        B
 2347     C        D
 31278    E        F
  

Я думаю, что это легко, возможно, я просто неправильно это объясняю. Я не настолько разбираюсь в python, но я могу сделать это с помощью SQL. Окончательная таблица выбора — это то, чего я пытаюсь достичь в python

 Create table #tmp1(
ID int,
[Case] varchar(20),
[NxtCase] varchar(20)
)

Create table #tmp2(
ID int,
[Case] varchar(20),
)



Insert into #tmp1(ID,[Case])
Select 23, 'A'
Union
Select 51, 'H'
Union
Select 63, 'L'


Insert into #tmp2(ID,[Case])
Select 23, 'A'
Union
Select 51, 'H'
Union
Select 63, 'L'
union
Select 23, 'D'
Union
Select 51, 'O'
Union
Select 63, 'E'



update t1
Set [NxtCase] =  t2.[Case]
from #tmp1 t1
    join #tmp2 t2
        on t1.ID = t2.ID
            and t1.[Case] <> t2.[Case] 

Select * from #tmp1
  

Ответ №1:

Я не уверен, что полностью понял разницу между dfObj2 и dfObj;

Однако вы можете начать работу над своей проблемой с помощью следующего метода :

Сначала нам нужно будет получить индекс буквы в алфавите, например, для буквы a , которую вы можете выполнить следующим образом:

 import string
indexOfA = string.ascii_uppercase.index('A')
  

Затем вы получите нужную букву в index 1 :

 letterB = string.ascii_uppercase[indexOfA   1]
  

Полный пример может быть решен с помощью, выполнив :

 import string

def findAndSet_nextLetter(x):
    return string.ascii_uppercase[
        string.ascii_uppercase.index(x.upper()) 1
    ]

dfObj2['NxtCase']=dfObj2["Case"].apply(findAndSet_nextLetter)
  

В основном он применяет функцию findAndSet_nextLetter к серии dfObj2[«Case»]
в результате :

     ID  Case    NxtCase
0   1   A   B
1   1   B   C
2   2   C   D
3   2   D   E
4   3   E   F
5   3   F   G
  

Комментарии:

1. Спасибо, Оделин, я ищу совпадающие идентификаторы, возвращающие отсутствующую букву. Вы, кошка, действительно делаете 1, потому что эти числа в порядке, и это может быть не так. идентификатор может быть любым nimber, но они будут одинаковыми для каждой пары

Ответ №2:

Решение:

 dfObj['NxtCase'] = dfObj.apply(lambda row:dfObj2[dfObj2['ID'] == row['ID']][dfObj2['Case']!=row['Case']]['Case'], axis =1).fillna(method='bfill',axis=1).iloc[:, 0]
  

Полное решение вопроса опубликовано здесь:
https://www.experts-exchange.com/questions/29198267/Python-dataframe-join-select-where-not-exists.html#questionAdd