Python 动态应用过滤器

Python 动态应用过滤器,python,pandas,filter,Python,Pandas,Filter,我有一个复杂的问题要解决。 我有一个数据帧,如: 所需的输出为: 因此,基本上是逻辑分组(即) 对于第一行:它只有a和a,因此a下只有1,剩下0 对于第二行:它是a和b,因此是1和1,其余的是0等等 下一步基于新的df: 对于每一行,我必须过滤一个数据帧(比如df3),例如: 第一行:df3.loc[(df3['name']='a')]['flag'].count() 第二行:df3.loc[(df3['name']='a')&(df3['name']='b')]['flag'].coun

我有一个复杂的问题要解决。 我有一个数据帧,如:

所需的输出为:

因此,基本上是逻辑分组(即)

对于第一行:它只有a和a,因此a下只有1,剩下0

对于第二行:它是a和b,因此是1和1,其余的是0等等

下一步基于新的df:

对于每一行,我必须过滤一个数据帧(比如df3),例如:

第一行:df3.loc[(df3['name']='a')]['flag'].count()

第二行:df3.loc[(df3['name']='a')&(df3['name']='b')]['flag'].count()

第三行:df3.loc[(df3['name']='a')&(df3['name']='b')&&(df3['name']='c')['flag'])。count()

你知道如何做到这一点吗

我试图在循环中生成这些过滤器,然后应用于df3数据帧

您可以使用numpy:

df1 = pd.DataFrame(0, index=list('aaaabbbb'), columns=list('abcd'))
print (df1)
   a  b  c  d
a  0  0  0  0
a  0  0  0  0
a  0  0  0  0
a  0  0  0  0
b  0  0  0  0
b  0  0  0  0
b  0  0  0  0
b  0  0  0  0
首先通过和创建下三角矩阵:

然后将对角线值填充到
1

按列数重复数组
a
,并使用数组
b
的值索引每个
size
行:

c = np.tile(a, (size, 1))
c[::size] = b
print (c)
[[1 0 0 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 1 0 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 0 1 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 0 0 1]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]]
最后一次转换为
数据帧

df = pd.DataFrame(c, columns=df1.columns, index = np.repeat(df1.columns, size))
print (df)
   a  b  c  d
a  1  0  0  0
a  1  1  0  0
a  1  1  1  0
a  1  1  1  1
b  0  1  0  0
b  1  1  0  0
b  1  1  1  0
b  1  1  1  1
c  0  0  1  0
c  1  1  0  0
c  1  1  1  0
c  1  1  1  1
d  0  0  0  1
d  1  1  0  0
d  1  1  1  0
d  1  1  1  1
我能做到。 所以在数据帧上使用“eval”。 我能够使用for循环生成字符串,并且能够在eval函数中传递该字符串。 例如:


因此,逻辑是针对
a
列中的第一个
a
1
,针对
b
列中的第一个
b
1
,针对
c
列中的第一个
c
1
?所有其他行都是从
1,1
1,1,1
?这是正确的。就像每行的逻辑“and”条件
一样,我必须过滤一个数据帧(比如df3)
?df3的外观如何?df3是另一个df,它有一列数据,如a、b、c、d,我将使用这些数据根据条件进行过滤。如果我编辑了我的帖子并添加了df3的结构,我将使用df3根据动态生成的过滤器过滤记录,使用DF1这是可行的!!!第一项任务完成:)谢谢lot@AkshatShreemali-不幸的是,仍然不理解第二个任务。您能解释一下为什么在
df3
中,头两行的
0
和第三行的
1是什么吗?或者换句话说,通过上述解决方案,
df3
的预期输出是什么?首先,非常感谢您的帮助。因此,对于df3,我只需要根据新dataframe创建的条件迭代地过滤其中的数据。例如:新数据帧的第一行将包含按条件筛选的df3记录:df3['name']='a',然后第二行将是df3['name'='a'和'b',然后第三行将是df3['name']='a和b和c,类似于此。df3将仅用于根据“和”进行筛选过滤器如果我们可以根据创建的数据帧动态生成这些过滤器,我无法动态生成这些过滤器。@AkshatShreemali-不幸的是,仍然不理解第二个任务。您能解释为什么df3中前两行为0,第三行为1吗?
c = np.tile(a, (size, 1))
c[::size] = b
print (c)
[[1 0 0 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 1 0 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 0 1 0]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]
 [0 0 0 1]
 [1 1 0 0]
 [1 1 1 0]
 [1 1 1 1]]
df = pd.DataFrame(c, columns=df1.columns, index = np.repeat(df1.columns, size))
print (df)
   a  b  c  d
a  1  0  0  0
a  1  1  0  0
a  1  1  1  0
a  1  1  1  1
b  0  1  0  0
b  1  1  0  0
b  1  1  1  0
b  1  1  1  1
c  0  0  1  0
c  1  1  0  0
c  1  1  1  0
c  1  1  1  1
d  0  0  0  1
d  1  1  0  0
d  1  1  1  0
d  1  1  1  1
for i in range(0,len(df.columns)):
        if len(df.columns[i])==1:
            uu=[]
            st = column + "==" +"'"+str(df.columns[i][0])+"'"
            #print(column)
            uu.append(st)
            uu2 = ' | '.join([str(elem) for elem in uu]) 
            # uu2 string will directly go to df to get evaluated
            aa = df[df.eval(uu2)]