对于大文本数据,如何使 Pandas df 列中的文本处理速度更快?

The*_*der 6 python regex dataframe python-3.x pandas

我有一个超过 1GB 的聊天数据 (chat.txt) 的大文本文件,格式如下:

john|12-02-1999|hello#,there#,how#,are#,you#,tom$ 
tom|12-02-1999|hey#,john$,hows#, it#, goin#
mary|12-03-1999|hello#,boys#,fancy#,meetin#,ya'll#,here#
...
...
john|12-02-2000|well#,its#,been#,nice#,catching#,up#,with#,you#,and#, mary$
mary|12-03-2000|catch#,you#,on#,the#,flipside#,tom$,and#,john$
Run Code Online (Sandbox Code Playgroud)

我想处理此文本并分别汇总每个用户的某些关键字的字数(比如 500 个字 - 你好,不错,喜欢......晚餐,没有)。此过程还涉及从每个单词中删除所有尾随特殊字符

输出看起来像

user   hello   nice   like    .....    dinner  No  
Tom    10000   500     300    .....    6000    0
John   6000    1200    200    .....    3000    5
Mary   23      9000    10000  .....    100     9000 
Run Code Online (Sandbox Code Playgroud)

这是我目前的pythonic解决方案:

chat_data = pd.read_csv("chat.txt", sep="|", names =["user","date","words"])
user_lst = chat_data.user.unique()
user_grouped_data= pd.DataFrame(columns=["user","words"])
user_grouped_data['user']=user_lst

for i,row in user_grouped_data.iterrows():
    id = row["user"]
    temp = chat_data[chat_data["user"]==id]
    user_grouped_data.loc[i,"words"] = ",".join(temp["words"].tolist())

result = pd.DataFrame(columns=[ "user", "hello", "nice", "like","...500 other keywords...", "dinner", "no"])
result["user"]= user_lst

for i, row in result.iterrows():
    id = row["user"]
    temp = user_grouped_data[user_grouped_data["user"]==id]
    words =  temp.values.tolist()[0][1]
    word_lst = words.split(",")
    word_lst = [item[0:-1] for item in word_lst]
    t_dict = Counter(word_lst)
    keys = t_dict.keys()
    for word in keys:
        result.at[i,word]= t_dict.get(word)

result.to_csv("user_word_counts.csv")
Run Code Online (Sandbox Code Playgroud)

这适用于小数据,但是当我的 chat_data 超过 1gb 时,此解决方案变得非常缓慢且无法使用。

下面有没有我可以改进的部分可以帮助我更快地处理数据?

  • 按用户对文本数据进行分组
  • 通过删除尾随特殊字符来清理每行中的文本数据
  • 计算单词并将单词计数分配到右列

DYZ*_*DYZ 2

我不确定这种方法在大型 DataFrame 上的速度有多快,但您可以尝试一下。首先,删除特殊字符并将字符串拆分为单词列表,从而形成另一列:

from itertools import chain
from collections import Counter
df['lists'] = df['words'].str.replace("#|\$", "").str.split(",")
Run Code Online (Sandbox Code Playgroud)

现在,按用户分组),将列表收集到一个列表中,并使用以下命令计算出现次数Counter

df.groupby('user')['lists'].apply(chain.from_iterable)\
                           .apply(Counter)\
                           .apply(pd.Series)\
                           .fillna(0).astype(int)
Run Code Online (Sandbox Code Playgroud)