Python 数据帧中groupby对象的两列中较大的一列
我有这样一个数据帧(最小可复制示例): 我试图做的是首先按搜索项进行分组,并为每个搜索项找到比率x和比率y中的较大值(同时保留数据框中的所有剩余列)。所以我想看到的结果是:Python 数据帧中groupby对象的两列中较大的一列,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有这样一个数据帧(最小可复制示例): 我试图做的是首先按搜索项进行分组,并为每个搜索项找到比率x和比率y中的较大值(同时保留数据框中的所有剩余列)。所以我想看到的结果是: Search_Term Exit_Pages Ratio_x Date_x Ratio_y Date_y Highest_Ratio hello /store/catalog .20 8/30/17 .25 7/30/17 .25 hello /sto
Search_Term Exit_Pages Ratio_x Date_x Ratio_y Date_y Highest_Ratio
hello /store/catalog .20 8/30/17 .25 7/30/17 .25
hello /store/product .15 8/30/17 .10 7/30/17
goodbye /store/search .35 8/30/17 .20 7/30/17
goodbye /store/product .25 8/30/17 .40 7/30/17 .40
我试图做的是创建一个groupby搜索项,并使用apply应用两列函数中的较大值,如下所示(我后来打算将此数据框与原始数据框连接,以包含上述值,但错误消息阻止我执行该步骤):
是否有一些小的修改,我可以使我的代码工作,如果是这样,它会是什么?如果没有,问题到底是什么?我如何解决这个问题?也许您想要的是
groupby
+transform
df['Highest_Ratio'] = df.groupby('Search_Term')\
['Ratio_x', 'Ratio_y'].transform('max').max(1)
df['Highest_Ratio']
0 0.25
1 0.25
2 0.40
3 0.40
Name: Highest_Ratio, dtype: float64
您可以使用np执行另一个步骤。其中
可获得准确的输出:
m = df['Highest_Ratio'].eq(df['Ratio_x']) | df['Highest_Ratio'].eq(df['Ratio_y'])
df['Highest_Ratio'] = np.where(m, df['Highest_Ratio'], '')
df
Search_Term Exit_Pages Ratio_x Date_x Ratio_y Date_y \
0 hello /store/catalog 0.20 8/30/17 0.25 7/30/17
1 hello /store/product 0.15 8/30/17 0.10 7/30/17
2 goodbye /store/search 0.35 8/30/17 0.20 7/30/17
3 goodbye /store/product 0.25 8/30/17 0.40 7/30/17
Highest_Ratio
0 0.25
1
2
3 0.4
请记住,最好跳过这一步,因为混合字符串和浮点数并不是性能方面的最佳选择。也许您想要的是
+转换
df['Highest_Ratio'] = df.groupby('Search_Term')\
['Ratio_x', 'Ratio_y'].transform('max').max(1)
df['Highest_Ratio']
0 0.25
1 0.25
2 0.40
3 0.40
Name: Highest_Ratio, dtype: float64
您可以使用np执行另一个步骤。其中
可获得准确的输出:
m = df['Highest_Ratio'].eq(df['Ratio_x']) | df['Highest_Ratio'].eq(df['Ratio_y'])
df['Highest_Ratio'] = np.where(m, df['Highest_Ratio'], '')
df
Search_Term Exit_Pages Ratio_x Date_x Ratio_y Date_y \
0 hello /store/catalog 0.20 8/30/17 0.25 7/30/17
1 hello /store/product 0.15 8/30/17 0.10 7/30/17
2 goodbye /store/search 0.35 8/30/17 0.20 7/30/17
3 goodbye /store/product 0.25 8/30/17 0.40 7/30/17
Highest_Ratio
0 0.25
1
2
3 0.4
请记住,最好跳过这一步,因为混合字符串和浮点数并不是性能方面的最佳方法。再次阅读此问题会让我觉得这是最好的方法solution@Bharath我觉得你的选择解决方案也很有趣(因为它被删除了,所以无法投票),我错过了分组部分。所以我认为这不是一个好的解决办法。谢谢!除了一个具体案例外,这完成了我需要的95%。当有多个情况给出相同的结果时,它只拉入第一个。如果我想把所有的多个比率都取出来呢?另外,你能给我解释一下你的解决方案的第二部分吗。.eq在做什么?@mkheifetz如果多行具有相同的最高值,那么我答案的第二部分也应该保留这些值。基本上,第二部分是创建一个掩码,并检查最高比率中的值是否与相应比率列中的值相同,如果是,则只保留这些值,屏蔽其他值。再次阅读问题使我认为这是solution@Bharath我觉得你选择的解决方案也很有趣(由于已删除,无法对其进行表决)我错过了分组的部分。所以思考不是一个好的解决方案。谢谢!除了一个特定的案例外,这完成了我所需要的95%。当有多个案例产生相同的结果时,它只会拉第一个。如果我想拉所有多个比率最高的案例呢?另外,你能向我解释第二个h吗如果多行具有相同的最高值,那么我的答案的第二部分也应该保留这些值。基本上,第二部分是创建一个掩码,并检查最高比值中的值是否与相应比值列中的值相同,如果是,则只保留这些值保持沉默,掩盖其他人。