我有一个包含工作人员的非常大的数据框(2000 万行)。有些 worker 出现了多次,因为他们之前可能曾在其他公司工作过。对于每个 worker ,我都有关于名字、姓氏(列:first_name、last_name)和每份工作的开始日期(started_working_date)的信息.我想在数据框 (past_experience) 中创建一个新列,标记以前(在任何公司)受雇的 worker 。
为此,我必须检查对于我的数据框中的每个工作人员,是否有一行(在同一数据框中)具有相同的名字和姓氏以及比所考虑的更早的开始日期。
数据框看起来像这样:
first_name last_name started_working_date
0 Bob J 1995-01-01
1 John S 2000-01-01
1 Mark L 2001-01-01
1 Bob J 1997-01-01
理想的结果应该是:
first_name last_name started_working_date past_experience
0 Bob J 1995-01-01 0
1 John S 2000-01-01 0
1 Mark L 2001-01-01 0
1 Bob J 1997-01-01 1
我尝试编写一个非常简单的应用函数,它根据我的条件过滤数据帧,并根据结果数据帧的长度返回 0 或 1。
def past_experience(row):
filtered_df = my_df[(my_df['first_name'] == row['first_name']) & (my_df['last_name'] == row['last_name']) & (my_df['started_working_date'] < row['started_working_date'])]
if filtered_df.shape[0]>0:
return 1
else:
return 0
my_df['past_experience'] = my_df.apply(past_experience, axis=1)
这可行,但效率极低。您能提出更好的解决方案吗?
最佳答案
我正在使用 numpy
广播,注意这个方法仍然是一个 o(n*n) 检查,这意味着如果你的数据帧很大,内存将会超出。
s1=my_df['first_name'].values
s2=my_df['last_name'].values
s3=my_df['started_working_date'].values
np.any((s1==s1[:,None])&(s2==s2[:,None])&(s3<s3[:,None]),1)
关于python - 在某些条件下检查数据框中是否存在值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55748727/