使用每个人都有几行的数据框,每人每行创建一个数据框,并获取特定属性的模式(每人)

时间:2019-06-17 10:48:21

标签: python pandas

给出一个熊猫数据框,例如:

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。

我可能正在处理包含数千行的数据帧,因此建议使用有效的答案。但是任何答案目前都足够。

编辑:添加了模式不是采样数据只是一个数字的情况

3 个答案:

答案 0 :(得分:2)

Series.mode与第一个值一起使用,因为它应该返回2个值并且只需要一个,对于eye_color,如果每个组中的所有值都相同,请使用GroupBy.first

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

答案 1 :(得分:1)

您可以使用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 :(得分:0)

尝试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
>>>