Python Pandas group by基于case语句[duplicate]

问题描述 投票:1回答:1

此问题已经在这里有了答案:

我为每个要在孩子名称上分组的孩子创建两行,并在同一行中拼凑父母的名字。

CHILD_FIRST_NAME CHILD_LAST_NAME PARENT_FIRST_NAME PARENT_LAST_NAME PARENT_GENDER
Sarah            Marshal         David             Marshal          M
Sarah            Marshal         Caren             Marshal          F
Kiran            Mishra          Raj               Mishra           M
Kiran            Mishra          Geetha            Mishra           F`

输出应为

CHILD_FIRST_NAME CHILD_LAST_NAME FATHER_FIRST_NAME FATHER_LAST_NAME MOTHER_FIRST_NAME MOTHER_LAST_NAME
Sarah            Marshal         David             Marshal          Caren             Marshal
Kiran            Mishra          Raj               Mishra           Geetha            Mishra

我尝试了此代码,这仅帮助我拼合“ PARENT_FIRST_NAME”,但无法找出包含“ PARENT_LAST_NAME”的选项,

df.groupby(['CHILD_FIRST_NAME','CHILD_LAST_NAME','PARENT_GENDER'])['PARENT_FIRST_NAME'].max().unstack().rename(columns={'M': 'FATHER_FIRST_NAME', 'F': 'MOTHER_FIRST_NAME'})
python pandas dataframe
1个回答
1
投票

这里有两种方法:

方法1:将索引设置为孩子和父母的性别,然后取消堆叠性别。按性别对列进行排序并重命名它们,然后重置索引。

df2 = (
    df
    .set_index(['CHILD_FIRST_NAME', 'CHILD_LAST_NAME', 'PARENT_GENDER'])
    .unstack()
    .sort_index(axis=1, level=1, ascending=False)
)
df2.columns = ['FATHER_FIRST_NAME', 'FATHER_LAST_NAME', 'MOTHER_FIRST_NAME', 'MOTHER_LAST_NAME']
df2 = df2.reset_index()

>>> df2
  CHILD_FIRST_NAME CHILD_LAST_NAME FATHER_FIRST_NAME FATHER_LAST_NAME  \
0            Sarah         Marshal             David          Marshal   
1            Kiran          Mishra               Raj           Mishra   

  MOTHER_FIRST_NAME MOTHER_LAST_NAME  
0             Caren          Marshal  
1            Geetha           Mishra  

方法2:根据性别对数据框进行分组,然后合并回父级(视情况而定,包括母亲或父亲)。

df2 = df[['CHILD_FIRST_NAME', 'CHILD_LAST_NAME']].drop_duplicates()

df_temp = (
    df
    .loc[df['PARENT_GENDER'].eq('M')]
    .rename(columns={'PARENT_FIRST_NAME': 'FATHER_FIRST_NAME',
                     'PARENT_LAST_NAME': 'FATHER_LAST_NAME'})
    .drop(columns='PARENT_GENDER')
)
df2 = df2.merge(df_temp, on=['CHILD_FIRST_NAME', 'CHILD_LAST_NAME'])

df_temp = (
    df
    .loc[df['PARENT_GENDER'].eq('F')]
    .rename(columns={'PARENT_FIRST_NAME': 'MOTHER_FIRST_NAME',
                     'PARENT_LAST_NAME': 'MOTHER_LAST_NAME'})
    .drop(columns='PARENT_GENDER')
)
df2 = df2.merge(df_temp, on=['CHILD_FIRST_NAME', 'CHILD_LAST_NAME'])
© www.soinside.com 2019 - 2024. All rights reserved.