我想在下表中找到包含重復電子郵件地址的行。當重復電子郵件地址時,我在以下代碼中的資料框中創建了一個額外的列,其值為“ja”。這適用于少量行 (150)。對于大量行 (30000),腳本掛起。有更好的方法來遍歷行嗎?
import pandas as pd
data={'Name':['Danny','Damny','Monny','Quony','Dimny','Danny'],
'Email':['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]','[email protected]']}
df=pd.DataFrame(data)
df['email_repeated']=None
col_email=df.columns.get_loc("Email")
row_count=len(df.index)
for i in range(0,row_count):
for k in range(0,row_count):
emailadres=df.iloc[i,col_email]
if k!=i:
if emailadres==df.iloc[k,col_email]:
df['email_repeated'][k] = 'ja'
uj5u.com熱心網友回復:
df.duplicated('Email', keep=False)
精確計算你想要的(布爾形式)
如果您堅持使用 'ja'/None,則可以保留初始列創建
df['email_repeated']=None
df.loc[dfOrg.duplicated('Email', keep=False), 'email_repeated']='ja'
至于字面上的問題(是否有更好的方法來遍歷 pandas 行),一般來說,答案是“不”。更好的迭代方法是不惜一切代價避免迭代。當然,某處有迭代。duplicated肯定會遍歷行。但是,它在 Pandas 代碼中,在 C 中,而不是在您解釋的 python 代碼中。您真正需要資料框中的回圈是非常罕見的。思考“如果我在遍歷 pandas 行,那么我做錯了什么”是一種很好的態度。即使是非常復雜的“非迭代”(我的意思是,當演算法使用回圈看起來很簡單時,連續操作來實作結果)通常比 for 回圈更可取。
在這種情況下,它并不復雜(有一個專門用于您的任務的函式)。但即使是包含將資料框與其自身合并以查找重復項或類似的事情的答案也可能比任何使用 for 回圈的方法都要快。
uj5u.com熱心網友回復:
您可以使用groupby transform計數。
df['cnt'] = df.groupby('Email').Email.transform('count')
df['email_repeated'] = df.cnt > 1
uj5u.com熱心網友回復:
作為 numpy.where 的單線器
df['email_repeated'] = np.where(df.duplicated("Email", keep=False), "ja", None)
uj5u.com熱心網友回復:
你的方法是 O(n 2 )。對于 30,000 行的情況,它需要進行大約 900,000,000 次比較。
一種更快的方法是按電子郵件地址對資料進行排序,然后檢查一個地址是否重復,您只需將其與前一行和后一行中的地址進行比較。如果您使用快速排序方法,這將是 O(n log(n))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519498.html
標籤:Python熊猫数据框
