Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧中groupby对象的两列中较大的一列_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 数据帧中groupby对象的两列中较大的一列

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

我有这样一个数据帧(最小可复制示例):

我试图做的是首先按搜索项进行分组,并为每个搜索项找到比率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        /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吗如果多行具有相同的最高值,那么我的答案的第二部分也应该保留这些值。基本上,第二部分是创建一个掩码,并检查最高比值中的值是否与相应比值列中的值相同,如果是,则只保留这些值保持沉默,掩盖其他人。