【问题标题】:How to count the number of matching items in pandas dataframe column from another column?如何从另一列计算熊猫数据框列中匹配项的数量?
【发布时间】:2017-03-09 23:24:07
【问题描述】:

在这个小数据框中:

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

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

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

预期的最终输出:

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

我尝试了什么:

d1 = d1.set_index(['pos'], append=True) # to set the pos value aside for simplicity

我可以使用任何一种方法(虽然并不完全有效),但我想学习这个过程。

然后:在一行中直接计数

d1_count = d1.apply(lambda x: d1.count(d1['F1']))

这是抛出错误消息。我知道我做错了。 那么,我的方法有什么问题?我怎样才能做得更好?

感谢任何带有解释的建议(对于任何或所有方法)。

【问题讨论】:

    标签: python arrays pandas numpy count


    【解决方案1】:

    可以使用apply方法循环遍历数据框行,使用str.count方法统计出现次数:

    df[['M1', 'M2']] = df.apply(lambda x: x.loc['M1':'M2'].str.count(x.F1), 1)
    df
    
    #  pos  M1  M2  F1
    #0  23  2   1   A
    #1  24  3   1   B
    #2  28  1   0   E
    

    如果要计算除pos 之外的所有列:

    df.set_index('pos').apply(lambda x: x.str.count(x.F1), 1).reset_index()
    
    #  pos  M1  M2  F1
    #0  23  2   1   1
    #1  24  3   1   1
    #2  28  1   0   1
    

    【讨论】:

    • 你的建议很好。但是,当我有很多列时就会出现问题。我想完全跳过提及该专栏。
    • 我只是稍微改变了输出。如果我可以只读取F1 的值而不提及columns,我可以稍后删除F1,然后从以前的数据帧中添加。有什么办法让它工作?
    • 我不确定你的意思。也许使用列位置?
    • 我的意思是我不想指出['M1', 'M2'],因为在我的原始数据中我会有很多列。
    • 为什么F1 列全是1?
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多