Roh*_*mal 2 python dataframe pandas
我想在下表中找到包含重复电子邮件地址的行。当电子邮件地址重复时,我在以下代码的数据框中创建一个额外的列,其值为“ja”。这对于少量行 (150) 来说是很好的。对于大量行 (30000),脚本会挂起。有更好的方法来循环行吗?
import pandas as pd
data={'Name':['Danny','Damny','Monny','Quony','Dimny','Danny'],
'Email':['danny@gmail.com','danny@gmail.com','monny@gmail.com','quony@gmail.com','danny@gmail.com','danny@gmail.com']}
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'
Run Code Online (Sandbox Code Playgroud)
df.duplicated('Email', keep=False)
Run Code Online (Sandbox Code Playgroud)
准确计算你想要的(布尔形式)
如果您坚持使用“ja”/无,则可以保留最初的列创建
df['email_repeated']=None
df.loc[dfOrg.duplicated('Email', keep=False), 'email_repeated']='ja'
Run Code Online (Sandbox Code Playgroud)
至于字面上的问题(是否有更好的方法来迭代 pandas 行),一般来说,答案是“不”。更好的迭代方法是不惜一切代价避免迭代。当然,某处存在迭代。duplicated肯定会迭代行。但是,它是在 pandas 代码中(用 C 语言)执行的,而不是在解释的 python 代码中执行的。在数据框中真正需要循环的情况很少见。思考“如果我迭代 pandas 行,那么我做错了什么”是一种很好的态度。即使是非常复杂的“非迭代”(我的意思是,当算法使用循环看起来很简单时,为了实现结果而进行的连续操作)通常也比 for 循环更可取。
在这种情况下,它并不复杂(有一个函数专门用于您的任务)。但即使答案是将数据帧与其自身合并以查找重复项,或类似的事情也可能比使用 for 循环的任何事情都要快得多。