在excel fi的所有工作表中计算@

2024-04-20 06:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我需要找出excel文件中有多少@。你知道吗

如果只有1页上的文件中有@,则返回我的当前代码。 我需要找出总共有多少个@,并且它应该在文件中存在的所有工作表中运行(每次编号/名称可以不同)。这有可能吗?你知道吗

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

Tags: 文件代码名称readsearchreturndefany
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()
    )

您的解决方案是可行的,尽管您有数百列的可能性很小,但如果第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调用。你知道吗


但是,如果您需要匹配的个数,您将别无选择,只能使用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

相关问题 更多 >