gpt4 book ai didi

python - 选择 Dataframe 中任何列等于列表中任何项目的行

转载 作者:行者123 更新时间:2023-12-04 18:01:26 25 4
gpt4 key购买 nike

假设我有以下数据框,我想选择任何值等于列表中任何项目的任何行:CodesOfInterest=['A','D']

>>> import pandas as pd
>>> d1=pd.DataFrame([['A','B','C','D'],['D','Q','S', np.nan],['R',np.nan,np.nan,np.nan],[np.nan,'A',np.nan,np.nan]],columns=['Code1','Code2','Code3','Code4'])
>>> d1
Code1 Code2 Code3 Code4
0 A B C D
1 D Q S NaN
2 R NaN NaN NaN
3 NaN A NaN NaN
>>>

这可以用一行代码很容易地完成:

>>> CodesOfInterest=['A','D']
>>> d1[(d1.isin(CodesOfInterest)==True).any(1)]
Code1 Code2 Code3 Code4
0 A B C D
1 D Q S NaN
3 NaN A NaN NaN
>>>

但是,假设我有以下第二个数据帧,其索引与第一个数据帧相同,它向该子集添加了一个条件。

>>> d2=pd.DataFrame([[1,0,1,0],[0,1,1, np.nan],[1,np.nan,np.nan,np.nan],[np.nan,1,np.nan,np.nan]],columns=['CodeStatus1','CodeStatus2','CodeStatus3','CodeStatus4'])
>>> d2
CodeStatus1 CodeStatus2 CodeStatus3 CodeStatus4
0 1 0 1 0
1 0 1 1 NaN
2 1 NaN NaN NaN
3 NaN 1 NaN NaN
>>>

现在我只想从我的 d1 中选择任何值等于我列表中任何时间的行,并且它们对应的“CodeStatus”(来自 d2)等于 1。通过对应的 CodeStatus,我的意思是成对的 ( Code1, CodeStatus1), (Code2, CodeStatus2), 等等

我有一种笨拙的方法来执行此操作,需要遍历 4 个代码和代码状态中的每一个。见下文:

>>> bs=[]    
>>> for Num in range(1,5):
... Code='Code'+str(Num)
... CodeStatus='CodeStatus'+str(Num)
... b=(df[Code].isin(CodesOfInterest))&(df[CodeStatus]==1)
... bs.append(b)
...
>>> Matches=pd.concat(bs,1)
>>>
>>> d1[(Matches==True).any(1)]
Code1 Code2 Code3 Code4
0 A B C D
3 NaN A NaN NaN
>>>

如您所见,记录 1 现在从数据框中删除,因为尽管它有一个代码为“D”的列,但此代码的代码状态不等于 1。

是否有更优雅的方式来进行不需要循环遍历每一列的查询?

最佳答案

你可以这样实现:

d1[pd.DataFrame((d1.isin(CodesOfInterest)==True).values*(d2==1).values).any(1)]

关于python - 选择 Dataframe 中任何列等于列表中任何项目的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com