【问题标题】:python count how many times a string is present in the entire row of a pandas dataframepython计算一个字符串在熊猫数据框的整行中出现的次数
【发布时间】:2023-03-04 19:00:02
【问题描述】:

我有一个基于我之前的question 的问题。下面的代码运行良好,它告诉我search_string 是否存在于整行中。如何修改最后一行,以便它为我提供匹配计数而不是 1 或 0?例如,对于第一行,它应该返回 4,因为我的 search_string 存在于该行的 4 个位置。

sales = [{'account': 'Jones LLC jones', 'Jan': '150', 'Feb': '200', 'Mar': '140 jones jones'},
         {'account': 'Alpha Co',  'Jan': 'Jones', 'Feb': '210', 'Mar': '215'},
         {'account': 'Blue Inc',  'Jan': '50',  'Feb': '90',  'Mar': '95' }]
df = pd.DataFrame(sales)
df

search_string = 'Jones'

(df.apply(lambda x: x.str.contains(search_string))
                       .sum(axis=1).astype(int))

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

    您可以使用findall.str.len

    sales = [{'account': 'Jones LLC jones', 'Jan': '150', 'Feb': '200', 'Mar': '140 jones jones'},
             {'account': 'Alpha Co',  'Jan': 'Jones', 'Feb': '210', 'Mar': '215'},
             {'account': 'Blue Inc',  'Jan': '50',  'Feb': '90',  'Mar': '95' }]
    df = pd.DataFrame(sales)
    df
    
    search_string = 'jones' #Note changed to lowercase j to find more data.
    
    (df.apply(lambda x: x.str.findall(search_string).str.len())
                           .sum(axis=1).astype(int))
    

    输出:

    0    3
    1    0
    2    0
    dtype: int32
    

    将@Vaishali 编辑添加到解决方案:

    df.apply(lambda x: x.str.lower().str.findall(search_string).str.len()).sum(axis=1).astype(int)
    

    输出:

    0    4
    1    1
    2    0
    dtype: int32
    

    【讨论】:

    • 为什么第二行没有返回 1?第二列第二行有琼斯
    • @Ni_Tempe 查看 Vaishali 修改的更新
    【解决方案2】:

    使用前面question 中的代码,我们简单地将any 方法更改为sum 方法。将所有 1 相加,以有效计算给定行 (axis=1) 中出现的次数。

    ## added and extra Jones into row 1 for 'Jan' column
    sales = [{'account': 'Jones LLC', 'Jan': 'Jones', 'Feb': '200', 'Mar': '140'},
             {'account': 'Alpha Co',  'Jan': 'Jones', 'Feb': '210', 'Mar': '215'},
             {'account': 'Blue Inc',  'Jan': '50',  'Feb': '90',  'Mar': '95' }]
    
    df = pd.DataFrame(sales)
    
    df_list = []
    
    for search_string in ['Jones', 'Co', 'Alpha']:
        #use above method but rename the series instead of setting to
        # a columns. The append to a list.
        df_list.append(df.apply(lambda x: x.str.contains(search_string))
                         .sum(axis=1) ## HERE IS SUM in place of any
                         .astype(int)
                         .rename(search_string))
    
    #concatenate the list of series into a DataFrame with the original df
    df = pd.concat([df] + df_list, axis=1)
    df
    
    Out[2]:
        Feb Jan    Mar   account     Jones  Co   Alpha
    0   200 Jones  140   Jones LLC   2      0    0
    1   210 Jones  215   Alpha Co    1      1    1
    2   90  50     95    Blue Inc    0      0    0
    

    【讨论】:

    • 我使用了搜索字符串“jones”,但在这个问题中提到的数据框中没有返回 4。是否搜索所有列?
    • @Ni_Tempe 是的,axis=1 部分应确保它是按行应用的。可能是您的实际 DataFrame 中有非字符串或对象类型的列,这会忽略它们。我认为这会引发错误。
    猜你喜欢
    • 2019-07-09
    • 2018-04-04
    • 1970-01-01
    • 2018-09-22
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2023-03-16
    相关资源
    最近更新 更多