我的数据框的格式为:
5 6 7
1 18 nan nan
2 nan 9 nan
3 nan nan 9
我希望能够返回类似的信息(显示唯一的值和频率)
A| B| C | D
a| x| r | 1
a| x| s | 2
a| y| r | 1
b| w| t | 4
b| z| v | 2
目前,我可以通过
快速计算出结果数据帧的第3列,但所有内容均安静A| freq of most common value in Column B |maximum of column D based on the most common value in Column B | most common value in Column B
a 2 2 x
b 1 4 w
但是为了计算第二列(“基于列B中最常见的值,列D的最大值”),我写了一个for循环巫婆,对于许多数据来说很慢。 有没有快速的方法?
答案 0 :(得分:5)
使用merge
并按DataFrameGroupBy.idxmax
每组最多获取D
行:
df1 = (df.groupby('A', sort=False)['B']
.apply(lambda x: x.value_counts().head(1))
.reset_index()
.rename(columns={'level_1':'E'}))
#print (df1)
df = df1.merge(df, left_on=['A','E'], right_on=['A','B'], suffixes=('','_'))
df = df.loc[df.groupby('A')['D'].idxmax(), ['A','B','D','E']]
print (df)
A B D E
1 a 2 2 x
2 b 1 4 w
答案 1 :(得分:2)
考虑分3个步骤进行操作:
df2 = (df.groupby('A', sort=False)['B']).apply(lambda x: x.value_counts().head(1)).reset_index()
df3 = df.groupby(['A','B']).agg({'D':max}).reset_index()
df2.merge(df3, left_on=['A','level_1'], right_on=['A','B'])
结果DataFrame中的D列将是您所需要的
A level_1 B_x B_y D
0 a x 2 x 2
1 b w 1 w 4