给出一个熊猫数据框,例如:
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。
我可能正在处理包含数千行的数据帧,因此建议使用有效的答案。但是任何答案目前都足够。
编辑:添加了模式不是采样数据只是一个数字的情况
答案 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
>>>