如何使用一个表达式与 lambda 合并两个计数值?

How to merge two count values using one expression with lambda?

在这个小数据框中:

d1 = pd.read_csv('to_count.mcve.txt', sep='\t')

pos   M1          M2      F1    F2
23    A,B,A,C,D   A,C,B   A     D
24    A,B,B,C,B   A,B,A   B     D
28    C,B,C,D,E   B,C     E     D

我想统计F1 和F2 中的值有多少在M1 和M2 中。作为一个学习过程,我把它分解成碎片。

我能做到:

d1_count = d1.apply(lambda x: x.loc[::].str.count(x.F1), 1)

输出:

        M1  M2  F1  F2
   pos                
 0 23    2   1   1   0
 1 24    3   1   1   1
 2 28    1   0   1   0

同样地

d2_count = d1.apply(lambda x: x.loc[::].str.count(x.F2), 1)

输出:

       M1  M2  F1  F2
  pos                
0 23    1   0   0   1
1 24    3   1   1   1
2 28    2   1   0   1

但是,我想要以下最终预期输出:

我想在一行中同时计算 F1 和 F2,并将 F1 值的输出用逗号分隔 F2

我们可以通过删除将 F1 和 F2 排除在外,这不是什么大问题。

         M1    M2    
   pos                
 0 23    2,1   1,0   
 1 24    3,3   1,1  
 2 28    1,2   0,1  

我尝试使用 join 但失败了,然后追加(它没有像我预期的那样工作):

d3_count = d1.apply(lambda x: x.loc[::].str.count(x.F1).append(x.loc[::].str.count(x.F2)), 1)

       M1  M2  F1  F2  M1  M2  F1  F2
  pos                                
0 23    2   1   1   0   1   0   0   1
1 24    3   1   1   1   3   1   1   1
2 28    1   0   1   0   2   1   0   1

任何输入请解释。

谢谢,

我会的;首先,使 pos 成为索引以从所有进一步的操作中消除它:

d1.set_index('pos', inplace=True)

reset_index() 如果你愿意,你可以稍后再去。现在,找到计数,将它们转换为字符串,然后 "add":

d1.apply(lambda x: x[['M1','M2']].str.count(x.F1), 1).astype('str') +\
"," +\
d1.apply(lambda x: x[['M1','M2']].str.count(x.F2), 1).astype('str')
#      M1   M2
#pos          
#23   2,1  1,0
#24   3,0  1,0
#28   1,1  0,0