2017-03-10 31 views
1

在这个小数据帧:如何使用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在一个线和输出把由F2分离F1值用逗号

我们可以离开F1和F2放弃这不是一个大问题。

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

我试图用加入,但失败了,然后追加(其中din't工作,因为我正好预期):

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 

任何输入与解释,请。

谢谢,

+0

你是怎么得到'3,3 1,1'的?它不是应该是'3,0,0'还是'3,0 1,0'? – DyZ

+0

哎呀,这应该是一个错字。我将不得不纠正它 – everestial007

+0

@DYZ:其实没有错别字。我刚刚更新了** F1和F2 **的计数以使问题更清楚。你能看看吗? – everestial007

回答

1

我会o这个;第一,使pos指数从所有进一步的操作消除它:

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

你的猫reset_index()如果您想以后。现在,找到计数,将它们转换为字符串,然后“添加”:

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 
+0

这样一个简单的方法来做到这一点,但我无法想象** str **。非常感谢。 – everestial007