基于以下条件的列表的条件位置比较

时间:2019-10-02 19:52:17

标签: python pandas

最近我问了类似的问题,但是错误消息和问题有所改变。

我想根据每个列表中项目的位置创建多个依赖于上一个列表的列表

例如,列表1将读取特定文件,并根据比较结果返回数字或布尔值false。

然后,第二个列表将比较与前一个列表中相同位置处出现的数字(如果前一个列表中的值不是false),并根据与第一个列表相同的比较返回值或false

数据帧示例:

a = pd.DataFrame([0,0.9,0.6,0.7,0.8])
b = pd.DataFrame([0.7,0.51,0.3,0.7,0.2])

我创建了执行这些比较并创建列表的函数

def generic_state_machine(file,obs_nums):
    return file.ix[:,0][obs_nums] if file.ix[:,0][obs_nums] > 0.2 else False
在这种情况下,

obs_nums表示项目在列表中的位置

然后我创建了查看不同文件的列表

session_to_leads = []
lead_to_opps = []

for i in range(1,len(a)):
     session_to_leads.append(generic_state_machine(file=a,obs_nums=i))
     lead_to_opps.append(generic_state_machine(file=b,obs_nums=i)) if session_to_leads != False else lead_to_opps.append(False)

我设法解决了遇到的初始错误,现在唯一的问题是,lead_to_opps列表不依赖于session_to_leads,因此,如果位置1中有False值,lead_to_opps不会在同一位置自动返回False。因此,假设random.uniform(0,1)始终生成0.5,这就是我当前的结果:

session_to_leads = [False,0.9,0.6,0.7,0.8]
lead_to_opps = [0.7,0.51,False,0.7,False]

这是我想要的结果:

session_to_leads = [False,0.9,0.6,0.7,0.8]
lead_to_opps = [False,0.51,False,0.7,False]

1 个答案:

答案 0 :(得分:0)

我可能不理解您的要求,您的意图也不清楚。您已经从列表创建了数据框。您只需要直接在数据框ab上工作。这里的方法适用于数据帧ab

m = a > 0.2
session_to_leads = a.where(a > 0.2, False)[0].to_list()

Out[755]: [False, 0.9, 0.6, 0.7, 0.8]

在拥有session_to_leads之后,对b使用相同的条件并结合条件m

lead_to_opps = b.where((b > 0.2) & m, False)[0].to_list()
Out[769]: [False, 0.51, 0.3, 0.7, False]

注意lead_to_opps的第三个元素是0.3,而不是您期望的输出中的False,因为条件是> 0.2和{ True中的{1}}