首页 > 解决方案 > 熊猫匹配两列并创建另一列

问题描述

我有一个包含 A 、B 、C 列的数据框。我想比较 B 和 C 列并创建两列 A-1(当前行年份 -1)和 A-2(当前行年份 -2),其中 A 是年列。

示例:在 1971 年的数据框中,B 列有苹果、橙子,C 列只有苹果,1970 年有 B-香蕉、苹果和 C-苹果。现在,对于 1971 年的每一行,我们尝试为 A-1(1970)、A-2(1969) 列生成值。在 (A-1)1970 年,苹果在 B、C 列中都被捕获,所以我们1971 年的前两行标记是,然后第三行标记为否,因为 1970 年没有橙色。

因此,对于每一行,我们都会考虑年份(比如 1971 年)并检查 B 和 C 值,并查看该特定 B 值是否也在 year-1(1970) 和 year-2(1969 的 C 列中捕获,在这种情况下它将是 nan,因为我们的数据框中没有 1969 的任何记录)并相应地标记它们。

数据框:

 A          B          C       D
1971       apple    apple      yes
1971       apple    apple      yes
1971       orange   nan        no
1970       banana   nan        no
1970       apple    apple      yes
1972       mango    mango      yes
1972       banana   banana     yes
1972       orange   orange     yes
1972       apple    apple      yes
1973       banana    nan       no
1973       mango     mango     yes
1973       apple     nan       no
1974       orange    nan       no

输出:

 A          B          C       A-1    A-2
1971       apple    apple      yes    nan
1971       apple    apple      yes    nan
1971       orange   nan        no     nan
1970       banana   nan        nan    nan
1970       apple    apple      nan    nan
1972       mango    mango      no     no 
1972       banana   banana     no     no
1972       orange   orange     no     no
1972       apple    apple      no     no
1973       banana    nan       yes    no
1973       mango     mango     yes    no
1973       apple     nan       yes    yes
1974       orange    nan       no     yes

我想不通,请帮助我。

标签: pythonpandasnumpypivotpandas-groupby

解决方案


df = pd.DataFrame(
    {'A': [1971,1971,1971,1970,1970,1972,1972,1972,1972,1973,1973,1973,1974], 
     'B': ['apple', 'apple', 'orange', 'banana', 'apple', 'mango', 'banana', 'orange', 'apple', 'banana', 'mango', 'apple', 'orange'],
     'C': ['apple', 'apple', 'nan', 'nan', 'apple', 'mango', 'banana', 'orange', 'apple', 'nan', 'mango', 'nan', 'nan'],
    })

fruits_by_year = df[df.C!='nan'].groupby('A')['C'].apply(set).to_dict()

def get_A_minus_n(x, n):
    if x.A-n not in fruits_by_year:
        return 'nan'
    elif x.B in fruits_by_year[x.A-n]:
        return 'yes'
    else:
        return 'no'

df['A-1'] = df.apply(lambda x: get_A_minus_n(x, 1), axis=1)
df['A-2'] = df.apply(lambda x: get_A_minus_n(x, 2), axis=1)

让我们首先构建一个名为 的字典fruits_by_year

  1. 丢弃其'C'为的行'nan'

  2. 按列分组'A'并在列中获取它们的值'C'

  3. 将值转换为集合

  4. 将整个结果转换为字典

它应该是:

{1970:{'apple'},1971:{'apple'},1972:{'apple','banana','mango','orange'},1973:{'mango'}}

然后建立两个新列。我们要:

  1. 构建一个get_A_minus_n在 3 种不同情况下返回不同值的函数

  2. 将该函数应用于 DataFrame 的每一行

注意:第 9 行的'A-1','A-2'应该是'yes','yes'


推荐阅读