python - 在某些条件下检查数据框中是否存在值的有效方法

标签 python pandas

我有一个包含工作人员的非常大的数据框(2000 万行)。有些 worker 出现了多次,因为他们之前可能曾在其他公司工作过。对于每个 worker ,我都有关于名字、姓氏(列:first_namelast_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/

相关文章:

python - 投票分类器导致转换 Numpy 类型错误

python - 替换/删除 pandas 数据中的某些文本?

python - 从 Pandas 中的两个不同行解析日期

python - 使用对数刻度标准化分类器分数以进行比较

python - 无法在 python 中使用 plotly 进行绘图

python - 选择具有范围的第一行(每 10 分钟)

python-3.x - 如何在 mplfinance 中显示替代日历日期?

python - 如何跟踪线性工作流程中的步骤

java - 如何在没有 numpy 的情况下将 Python 代码转换为 Java

java - Spark Java 错误 : Size exceeds Integer. MAX_VALUE