根据另一个数据框的列条目过滤一个数据框的行的最佳方法是什么

What is the best way to filter rows of one dataframe based on column entries of another dataframe

我在 python 中有两个数据框,一个名为 DayList,包含以下列:OrderNr Powder Variant Quantity DueDate,另一个名为 Planning,包含以下列:Order Start End Day Powder Variant Task。 两个数据框都有多行特定组合,Powder 和 Variant 的列条目将是一个整数,我想将数据框 DayList 过滤为三类。

第一类是行的子集,其中 Powder 和 Variant 的确切组合也存在于数据框 Planning 的某处。 第二类是行的子集,其中 Powder 和 Variant 的确切组合不存在于数据框 Planning 中,但 Powder 的条目位于数据框 Planning 的 Powder 列中的某处。 第三类是行的子集,其中 Powder 的条目不在数据框 Planning 的 Powder 列中。

这三个类别不应重叠,而应共同构成数据框 DayList 的所有行。 我对数据框很陌生,所以我不确定如何定义它。我一直在尝试使用 isin() 但我似乎对第一类的正确语句感到困惑。

您可以编写一个函数来确定数据帧给定行的类别,然后使用 df.apply()。为避免必须在函数中选择正确的列,您可以仅将其应用于简化的数据框,仅由 PowderVariant 列组成:

import pandas as pd

# example dataframes with just the relevant columns, but 
# the code below also works for dataframes containing additional columns
DayList = pd.DataFrame({'Powder': [1, 2, 3, 4, 5, 6],
                        'Variant': [1, 2, 1, 2, 1, 2]})
Planning = pd.DataFrame({'Powder': [3, 4, 5, 6],
                         'Variant': [1, 2, 2, 1]})

def determine_category(row):
    powder, variant = row.values
    if [powder, variant] in Planning[['Powder', 'Variant']].values.tolist():
        return 1
    if powder in Planning['Powder'].values:
        return 2
    return 3

DayList['Category'] = DayList[['Powder', 'Variant']].apply(
                      determine_category, axis=1)
DayList
    Powder  Variant  Category
0   1       1        3
1   2       2        3
2   3       1        1
3   4       2        1
4   5       1        2
5   6       2        2