根据变量值在数据框中查找最大值

时间:2020-01-09 12:15:16

标签: python pandas pandas-groupby

我的数据框的格式为:

  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循环巫婆,对于许多数据来说很慢。 有没有快速的方法?

该问题链接到:Count values in dataframe based on entry

2 个答案:

答案 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个步骤进行操作:

  1. 找到最常见的B(如您的代码中所示):

df2 = (df.groupby('A', sort=False)['B']).apply(lambda x: x.value_counts().head(1)).reset_index()

  1. 为A和B的每种组合构建具有最大D的DataFrame

df3 = df.groupby(['A','B']).agg({'D':max}).reset_index()

  1. 合并2个数据帧以查找与先前选择的A-B对匹配的最大Ds

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