使用Dataframe为每个人创建多行,为每个人创建一行,并获取某个属性的模式(每个人)

2024-06-24 12:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个数据帧,例如:

fName       lName       smokes  eye_color
Bob         McCain         1      black
Bob         McCain         0      black
Bob         McCain         1      black
Ryan        Diedre         0      brown
Ryan        Diedre         0      brown
Ryan        Diedre         1      brown
John        Madden         1      green
John        Madden         0      green

由不同家庭成员对一个人的看法构成

如何创建数据帧,例如:

fName       lName       smokes   eye_color
Bob         McCain         1       black
Ryan        Diedre         0       brown
John        Madden         1      green

在Python中

基本上,我希望第二个(新的)数据帧对于数据帧1中fName和lName的每个唯一组合都有一行。如果没有重复值,只需选择第一个。Smokes值只能为0或1

我可能正在处理包含数千行的数据帧,因此一个有效的答案是可取的。但现在任何答案都足够了

编辑:添加了一个场景,其中模式不仅仅是样本数据的一个数字


Tags: 数据greenjohnfnamecolorbobblackeye
3条回答

可以使用groupby,然后使用pd.Series.mode

def filt(x):
    return x.iat[0] if len(x.mode())>1 else x.mode()

df.groupby(['fName', 'lName'], as_index=False).agg({'smokes': filt, 'eye_color': 'first'})

   fName    lName   smokes  eye_color
0   Bob     McCain   1       black
1   John    Madden   1       green
2   Ryan    Diedre   0       brown

pd.Series.mode返回最频繁的值

对第一个值使用^{},因为它应该返回2个值并且只需要一个值,对于eye_color,如果每个组的所有值都相同,则使用^{}

df1 = (df.groupby(['fName','lName'])
         .agg({'smokes': lambda x: x.mode().iat[0], 'eye_color':'first'})
         .reset_index())

如果每个组的两列中都需要最频繁的值:

df1 = (df.groupby(['fName','lName'])
         .agg({'smokes': lambda x: x.mode().iat[0], 'eye_color':lambda x: x.mode().iat[0]})
         .reset_index())
print (df1)
  fName   lName  smokes eye_color
0   Bob  McCain       1     black
1  Ryan  Diedre       0     brown

试试groupby

>>> df.groupby('fName', as_index=False).apply(lambda x: x.mode()).reset_index(level=1).iloc[:, 1:]
  fName   lName  smokes eye_color
0   Bob  McCain       1     black
1  Ryan  Diedre       0     brown
>>> 

相关问题 更多 >