熊猫匹配两列并创建另一列

时间:2019-01-12 15:02:38

标签: python pandas numpy pivot pandas-groupby

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

示例:在1971年的数据框中,B列具有苹果,橙色 C列只有苹果,1970年有B香蕉,苹果和C-apple。 现在,我们尝试为1971年的每一行生成A-1(1970)和A-2(1969)列的值。在(A-1)1970年,B,C列均捕获了苹果,因此我们在1971年的前两行中标记为“是”,然后在第三行中将其标记为“否”,因为1970年中没有橙色。

因此,对于每一行,我们考虑年份(例如1971),并检查B和C值,看看是否在year-1(1970)和year-2(1969)的C列中也捕获了该特定的B值,在这种情况下将是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

我不知道,请帮助我。

1 个答案:

答案 0 :(得分:0)

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. 的行
  3. 按列'A'分组,并在列'C'中获取它们的值

  4. 将值转换为一组

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

应该是:

  

{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'