Python:计算数据框列中所有行中特定字符的实例

Python: Count instances of a specific character in all rows within a dataframe column

我有一个包含列 ['toaddress'、'ccaddress'、'body']

的数据框 (df)

我想遍历数据帧的索引,以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小、最大和平均数量,这是通过计算这两个字段中每个字段中的和“@”的实例来确定的列

如果一切都失败了,我想我可以只使用 df.toaddress.str.contains(r'@').sum() 并将其除以数据框中的行数以获得平均值,但我认为它只是计算至少有 1 个 @ 符号的行。

len(filter(lambda df: df.toaddress.str.contains(r'@'),rows))

甚至

len(filter(lambda df: r'@' in str(df.toaddress), rows))

也许是这样的

from pandas import *
import re

df = DataFrame({"emails": ["fake@gmail.com, example@gmail.com", 
                           "KingArthur@aol.com, none, SirRobyn@msn.net, TheBlackKnight@clintonserver.com"]})

at = re.compile(r"@", re.I)
def count_emails(string):
    count = 0
    for i in at.finditer(string):
        count += 1
    return count

df["count"] = df["emails"].map(count_emails)

df

Returns:

    emails                                                  count
0   "fake@gmail.com, example@gmail.com"                     2
1   "KingArthur@aol.com, none, SirRobyn@msn.net, Th..."     3

您可以使用

df[['toaddress', 'ccaddress']].applymap(lambda x: str.count(x, '@'))

返回每个单元格中 '@' 的计数。

然后您可以只计算结果中沿行轴的 pandas maxminmean

正如我对原始问题的评论,您已经建议使用 df.toaddress.str.contains(r'@').sum() - 如果您愿意逐列而不是我上面显示的方法,为什么不使用 df.toaddress.str.count(r'@')

本答案使用https://pypi.python.org/pypi/fake-factory生成测试数据

import pandas as pd
from random import randint
from faker import Factory
fake = Factory.create()

def emails():
    emailAdd = [fake.email()]
    for x in range(randint(0,3)):
        emailAdd.append(fake.email())

    return emailAdd

df1 = pd.DataFrame(columns=['toaddress', 'ccaddress', 'body'])

for extra in range(10):
    df1 = df1.append(pd.DataFrame({'toaddress':[emails()],'ccaddress':[emails()],'body':fake.text()}),ignore_index=True)

print('toaddress length is {}'.format([len(x) for x in df1.toaddress.values]))
print('ccaddress length is {}'.format([len(x) for x in df1.ccaddress.values]))

最后两行是计算您的电子邮件的部分。 我不确定你是否想专门检查 '@',也许你可以使用 fake-factory 生成一些测试数据作为示例?