簡體   English   中英

將函數應用於 Pandas 數據幀:是否有更節省內存的方法?

[英]Applying function to pandas dataframe: is there a more memory-efficient way of doing this?

我有一個數據框,它有少量列但有很多行(現在大約 900K,隨着我收集更多數據,它會變得更大)。 它看起來像這樣:

作者 標題 日期 類別 文本 網址
0 阿米拉·查菲丁 野生法迪拉 01 2019-01-01 小說 الكتاب هذا نهديه لكل تونسي حس إلي الكتاب يحكي ... NaN
1 阿米拉·查菲丁 野生法迪拉 02 2019-01-01 小說 في التزغريت، والعياط و الزمامر، ليوم نتيجة الب... NaN
2 253826 1515368_7636953 2010-12-28 /論壇/論壇/91/ هذا ما ينص عليه إدوستور التونسي لا رئاسة مدى ا... https://www.tunisia-sat.com/forums/threads/151..
3 250442 1504416_7580403 2010-12-21 /論壇/體育/ \\n\\n\\n\\n\\n\\nاعلنت الجامعة التونسية لكرة اليد ا... https://www.tunisia-sat.com/forums/threads/150..
4 312628 1504416_7580433 2010-12-21 /論壇/體育/ quel est le résultat final\\n,,,,???? https://www.tunisia-sat.com/forums/threads/150..

“文本”欄包含一串文本,可能只有幾個字(在論壇帖子的情況下),也可能是小說的一部分,有數萬個字(如上面的前兩行) .

我有從各種語料庫文件(.txt 和 .json)構建數據框的代碼,然后清理文本並將清理后的數據框保存為 pickle 文件。

我正在嘗試運行以下代碼來分析不同單詞的拼寫在語料庫中的變化程度。 這些函數看起來很簡單:計算每個 Text 行中特定拼寫變量的出現次數; 另一個獲取此類頻率的列表並計算每個引理的基尼系數(這只是拼寫異質性的數字度量)。 它引用了一個以引理為鍵的拼寫_var 字典,以及將該引理作為值的各種拼寫方法。 (類似於 {'color': ['color', 'colour']} 除非不是英文。)

此代碼有效,但它使用了大量內存。 我不確定多少,但我使用 PythonAnywhere 進行編碼,這段代碼將我送入了tarpit(換句話說,它使我超過了每天的 CPU 秒數)。

有沒有辦法做到這一點,以減少內存密集度? 最好不需要我學習另一個軟件包(過去幾周我一直在學習 Pandas 並且很喜歡它,並且需要繼續我的分析)。 一旦我有了代碼並完成了語料庫的收集,我只會運行幾次; 我不會每天都運行它或任何事情(以防萬一)。

這是代碼:

import pickle
import pandas as pd
import re

with open('1_raw_df.pkl', 'rb') as pickle_file:
    df = pickle.load(pickle_file)

spelling_var = {
    'illi': ["الي", "اللي"],
    'besh': ["باش", "بش"],
    ...
    }

spelling_df = df.copy()

def count_word(df, word):
    pattern = r"\b" + re.escape(word) + r"\b"
    return df['Text'].str.count(pattern)

def compute_gini(freq_list):
    proportions = [f/sum(freq_list) for f in freq_list]
    squared = [p**2 for p in proportions]
    return 1-sum(squared)

for w, var in spelling_var.items():
    count_list = []
    for v in var:
        count_list.append(count_word(spelling_df, v))
        gini = compute_gini(count_list)
    spelling_df[w] = gini

我在最后一個雙循環中重寫了兩行,請參閱下面代碼中的注釋。 這能解決你的問題嗎?

gini_lst = []
for w, var in spelling_var.items():
    count_list = []
    for v in var:
        count_list.append(count_word(spelling_df, v))
        #gini = compute_gini(count_list)  # don't think you need to compute this at every iteration of the inner loop, right?
    #spelling_df[w] = gini  # having this inside of the loop creates a new column at each iteration, which could crash your CPU
    gini_lst.append(compute_gini(count_list))

# this creates a df with a row for each lemma with its associated gini value
df_lemma_gini = pd.DataFrame(data={"lemma_column": list(spelling_var.keys()), "gini_column": gini_lst})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM