Python数据帧联接选择不存在的位置



我下面有两个数据帧,我想设置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值必须根据ID而不是Case列中当前存在的值来等于缺失的字母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

我不确定我是否完全得到了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

解决方案:

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

相关内容

最新更新