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 max
、min
和 mean
。
正如我对原始问题的评论,您已经建议使用 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 生成一些测试数据作为示例?
我有一个包含列 ['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 max
、min
和 mean
。
正如我对原始问题的评论,您已经建议使用 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 生成一些测试数据作为示例?