【问题标题】:Count @ in all sheets in an excel file在excel文件的所有工作表中计算@
【发布时间】:2018-01-14 21:57:05
【问题描述】:

所以我需要找出一个excel文件中有多少个@。

如果文件中有@,则我当前的代码仅在 1 张纸上返回。 我需要找出总共有多少@,并且它应该运行在文件中存在的所有工作表中(数字/名称每次都可以不同)。这甚至可能吗?

def excel_contains_str(filename, search='@'):
    return pd.read_excel(filename).astype(str).apply(lambda x: x.str.contains(search)).any().any()

【问题讨论】:

  • 是的,为什么不呢。您的解决方案似乎也有效。
  • @cᴏʟᴅsᴘᴇᴇᴅ 但它不返回它找到的@的数量

标签: python excel python-3.x pandas


【解决方案1】:

您的解决方案有效,尽管如果您有数百列,那么在第 3 列本身存在匹配项时搜索所有列有点浪费。因此,请考虑遍历您的列,并使用内置的 any 缩短您的操作。

def excel_contains_str(filename, search='@'):
    df = pd.read_excel(filename, dtype='str')
    return any(df[c].str.contains(search).any() for c in df.columns)

在您的列中读取时,请指定dtype='str',以便将它们作为字符串读取。这可以避免后续的astype 调用。


但是,如果您需要 number 个匹配项,您别无选择,只能使用 apply 并对这些值求和。

def excel_contains_str(filename, search='@'):
    df = pd.read_excel(filename, dtype='str')
    return df.apply(lambda x: x.str.contains(search)).values.sum()

演示 -

df = pd.DataFrame({
    'A' : ['aaa', 'bbb', 'ccc'], 
    'B' : ['foo@bar.com', np.nan, 'test@baz.com'], 
    'C' : [1, 2, 1]
})
df    
     A             B  C
0  aaa   foo@bar.com  1
1  bbb           NaN  2
2  ccc  test@baz.com  1

df.astype(str).apply(lambda x: x.str.contains('@')).values.sum()
2

【讨论】:

  • 这很好用,如果我想搜索一个完整的单词,比如“zipcode”.. 据我了解,这个函数会分解单词并匹配每个字符,或者我错了?
  • @RasmusBidstrup 它没有。通过search='^zipcode$',正则表达式模式指定全词匹配。否则,您可以在 lambda 中使用 x.eq('zipcode')
  • 而不是 'x.str.eq(search)' 和 '.str.'?
  • @RasmusBidstrup 不,eq 不是 .str 访问器系列的一部分。
【解决方案2】:

要读取 excel 文件中的所有工作表,请将 sheet_name=None 传递给 read_excel

def excel_contains_str(filename, search='@'):
    return sum(
        df.astype(str).apply(lambda x: x.str.contains(search)).values.sum()
        for name, df in pd.read_excel(filename, sheet_name=None).items()
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2021-10-31
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多