Python解析用户名的大型CSV文件
我有一个非常大的csv文件(+50k行) 此文件包含IRC日志,以下是数据格式:Python解析用户名的大型CSV文件,python,csv,large-files,Python,Csv,Large Files,我有一个非常大的csv文件(+50k行) 此文件包含IRC日志,以下是数据格式: 第1列:消息类型(1为消息,2为系统) 第二列:时间戳(自精确日期起的秒数) 第三列:写消息者的用户名 第四栏:信息 下面是一个数据示例: 11382445487956,“鲍勃”,“我不知道怎么做这样的任务” 11382025765196,“爱丽丝”,“兄弟问我” 11382454875476,“我很确定用python可以做到,鲍勃” 21380631520410,“helloman”,“helloman_uu
- 第1列:消息类型(1为消息,2为系统)
- 第二列:时间戳(自精确日期起的秒数)
- 第三列:写消息者的用户名
- 第四栏:信息
11382445487956,“鲍勃”,“我不知道怎么做这样的任务”
11382025765196,“爱丽丝”,“兄弟问我”
11382454875476,“我很确定用python可以做到,鲍勃”
21380631520410,“helloman”,“helloman_uu加入成龙。”
例如,\u XxCoder\u killerxX\u
提到了bob
所以,知道了所有这些,我想知道哪对用户名相互提及最多。我希望消息被计数,因此我只需要处理以数字“1”开头的行(因为有一堆以“2”开头的行和其他不相关的数字)
我知道可以使用
csv
Python模块来完成,但我从未使用过如此大的文件,所以我真的不知道如何开始所有这些。您应该执行csv的两个过程:一个是捕获所有发送者用户名,另一个是查找消息中提到的发送者用户名
import csv
users = set()
with open("test.csv", "r") as file:
reader = csv.reader(file)
for line in reader:
users.add(line[2])
mentions = {}
with open("test.csv", "r") as file:
reader = csv.reader(file)
for line in reader:
sender, message = line[2], line[3]
for recipient in users:
if recipient == sender:
continue # can't mention yourself
if recipient in message:
key = (sender, recipient)
mentions[key] = mentions.get(key, 0) + 1
for mention, times in mentions.items():
print(f"{mention[0]} mentioned {mention[1]} {times} time(s)")
totals = {}
for mention, times in mentions.items():
key = tuple(sorted(mention))
totals[key] = totals.get(key, 0) + times
for names, times in totals.items():
print(f"{names[0]} and {names[1]} mentioned each other {times} time(s)")
这个例子很幼稚,因为它正在执行简单的子字符串匹配。因此,如果有人叫“foo”,有人在消息中提到“food”,则表示匹配。您应该执行两次CSV传递:一次捕获所有发件人用户名,另一次查找消息中提到的发件人用户名
import csv
users = set()
with open("test.csv", "r") as file:
reader = csv.reader(file)
for line in reader:
users.add(line[2])
mentions = {}
with open("test.csv", "r") as file:
reader = csv.reader(file)
for line in reader:
sender, message = line[2], line[3]
for recipient in users:
if recipient == sender:
continue # can't mention yourself
if recipient in message:
key = (sender, recipient)
mentions[key] = mentions.get(key, 0) + 1
for mention, times in mentions.items():
print(f"{mention[0]} mentioned {mention[1]} {times} time(s)")
totals = {}
for mention, times in mentions.items():
key = tuple(sorted(mention))
totals[key] = totals.get(key, 0) + times
for names, times in totals.items():
print(f"{names[0]} and {names[1]} mentioned each other {times} time(s)")
这个例子很幼稚,因为它正在执行简单的子字符串匹配。因此,如果有人叫“foo”,有人在消息中提到“food”,则表示匹配。这里有一个使用pandas和set的解决方案。熊猫的使用大大简化了csv数据的导入和操作,集合的使用允许将{'alice','bob'}和{'bob','alice'}计算为相同组合的两个实例
df = pd.read_csv('sample.csv', header=None)
df.columns = ['id','timestamp','username','message']
lst = []
for name in df.username:
for i,m in enumerate(df.message):
if name in m:
author = df.iloc[i,2]
lst.append({author, name})
most_freq = max(lst, key=lst.count)
print(most_freq)
#{'bob', '_XxCoder_killerxX_'}
下面是一个使用熊猫和集合的解决方案。熊猫的使用大大简化了csv数据的导入和操作,集合的使用允许将{'alice','bob'}和{'bob','alice'}计算为相同组合的两个实例
df = pd.read_csv('sample.csv', header=None)
df.columns = ['id','timestamp','username','message']
lst = []
for name in df.username:
for i,m in enumerate(df.message):
if name in m:
author = df.iloc[i,2]
lst.append({author, name})
most_freq = max(lst, key=lst.count)
print(most_freq)
#{'bob', '_XxCoder_killerxX_'}
你知道如何处理小文件吗?我会说我会将所有用户名保存到dict中,然后检查所有消息,以确定是否有人提及,然后我必须将它们计算出来,以找到数量最多的一个?是的。。。你试过了吗?有问题吗?是的,我一直在尝试,但我想不出存储数据的方法,我知道如何存储所有用户名,但不知道如何计算配对用户名相互提及的次数。使用
pandas
这将非常简单。你知道如何处理小文件吗?我会说我会将所有用户名保存到dict中,然后检查所有消息,以确定是否有人提及,然后我必须数一数,找出人数最多的那个?是的。。。你试过了吗?有问题吗?是的,我一直在尝试,但我想不出一种存储数据的方法,我知道如何存储所有用户名,但不知道如何计算两个用户名相互提及的次数。这将非常容易使用pandas
哇,差不多完成了,我如何知道现在相互提及最多的两个用户名呢?在上面的示例中添加了代码。我会让你找到最大的数量。非常感谢你的编辑!但您的代码似乎给了我自我提及的结果,例如bob bob相互提及了X次
我已经改进了代码以避免提及您自己。请随意增强示例以满足您的独特需求。哇,差不多完成了,我如何知道现在相互提及最多的两个用户名呢?在上面的示例中添加了代码。我会让你找到最大的数量。非常感谢你的编辑!但是,您的代码似乎给了我自我提及的结果,例如,bob bob相互提及了X次
我改进了代码,以避免提及您自己。请随意增强示例以满足您的独特需要。如果您要这样做,您真的不应该使用pandas
。而且,most_freq=max(lst,key=lst.count)
效率非常低。使用pandas也很好。我想他的意思是,我没有使用pandas数据帧的全部功能,因为我在遍历它的列。在本例中,我只是使用dataframe来存储数据。csv文件中的731行似乎由于太多双引号而损坏。要么删除它,要么将其更改为11380877652084,“Lukaaas”,即“九倍于它必须是的,否”,是的。df=pd.Dataframe(您的命令)您也可以尝试df=pd.read\u csv('sample.csv',header=None,skiprows=[731])。玩这个数字。如果731不工作,请尝试730或732。另外,如果您收到关于其他损坏行的erros消息,您可以通过skiprows=[731921,…]跳过它们。如果要这样做,您真的不应该使用pandas
。而且,most_freq=max(lst,key=lst.count)
效率非常低。使用pandas也很好。我想他的意思是,我没有使用pandas数据帧的全部功能,因为我在遍历它的列。在本例中,我只是使用dataframe来存储数据。csv文件中的731行似乎由于太多双引号而损坏。要么删除它,要么将其更改为11380877652084,“Lukaaas”,即“九倍于它必须是的,否”,是的。df=pd.Dataframe(您的命令)您也可以尝试df=pd.read\u csv('sample.csv',header=None,skiprows=[731])。玩这个数字。如果731不工作,请尝试730或732。此外,如果您收到关于其他损坏线路的erros消息,您可以通过skiprows跳过它们=