使用条件

时间:2016-07-08 22:45:22

标签: python pandas join merge group-by

我正在尝试在python / pandas中复制SQL中相当简单的东西,但是卡住了。

我想要一个包含三列的数据框:

dataframe1

    Org Des Score
0   A   B   10
1   A   B   11
2   A   B   15
3   A   C   4
4   A   C   4.5
5   A   C   6
6   A   D   100
7   A   D   110
8   A   D   130

并过滤掉每个Org-Des组合的所有得分值,大于最小值* 1.2。

因此输出表将是:

output_dataframe

    Org Des Score
0   A   B   10
1   A   B   11
3   A   C   4
4   A   C   4.5
6   A   D   100
7   A   D   110

对于第一个Org-Des组合,A-B,最小分数为10且(1.2 *分钟)= 12.因此,将保留第0和第1行,因为分数10和11是< 12.第3行将被删除,因为它是> 12。

对于A-C,最小分数为4且(1.2 *分钟)= 5.因此第3和第4行被保留,因为它们是<等等......

我的方法

我以为我会使用以下方法:

  1. 使用groupby函数通过Org-Des对创建一个包含分钟的数据帧:

    dataframe2 = pd.DataFrame(dataframe1.groupby(['Org','Des'])['Score'].min())
    
  2. 然后在dataframe1和dataframe2之间进行内部联接(或合并?),条件是<每个Org-Des对类型为1.2 * min。

  3. 但由于两个原因,我无法让这个工作,1)dataframe2最终成为一个时髦的形状,我需要弄清楚如何加入或合并dataframe1,或转换然后加入/合并2)我不知道如何设置标准作为加入/合并的一部分。

    这是正确的方法还是有更多的pythonic方法来实现相同的目标?

    编辑以反映@Psidom回答:

    我尝试了你建议的代码并且它给了我一个错误,这里是完整的代码和输出:

    In: import pandas as pd 
        import numpy as np 
    
    In: df1 = pd.DataFrame({'Org': ['A','A','A','A','A','A','A','A','A'],
                            'Des': ['B','B','B','C','C','C','D','D','D'],
                            'Score': ['10','11','15','4','4.5','6','100','110','130'], })
    
    Out:    Org Des Score
        0   A   B   10
        1   A   B   11
        2   A   B   15
        3   A   C   4
        4   A   C   4.5
        5   A   C   6
        6   A   D   100
        7   A   D   110
        8   A   D   130
    
    In: df2 = pd.DataFrame(df1.groupby(['Org','Des'])['Score'].min())
        df2
    
    Out:        Score
        Org Des 
        A   B   10
            C   4
            D   100
    
    In: df1 = pd.merge(df1, df2.groupby(['Org', 'Des']).min()*1.2, left_on = ['Org', 'Des'], right_index=True)
        df.loc[df1.Score_x < df1.Score_y, :]
    
    Out: KeyError: 'Org' #It's a big error but this seems to be the relevant part.  Let me know if it would be useful to past the whole error.  
    

    我怀疑我可能将df1,df2和df混淆了吗?我改变了原来的答案帖子以匹配代码。

2 个答案:

答案 0 :(得分:2)

您可以设置连接条件。对于原始数据框,将连接列设置为['Org', 'Des'],对于聚合数据框,分组列成为索引,因此您需要将right_index设置为true,然后它应按预期工作:

import pandas as pd
df1 = pd.DataFrame({'Org': ['A','A','A','A','A','A','A','A','A'],
                    'Des': ['B','B','B','C','C','C','D','D','D'],
                    'Score': [10,11,15,4,4.5,6,100,110,130]})
df2 = pd.DataFrame(df1.groupby(['Org','Des'])['Score'].min())

df3 = pd.merge(df1, df2, left_on = ['Org', 'Des'], right_index=True)
df1.loc[df3.Score_x < df3.Score_y * 1.2, ]

#  Org  Des Score
#0  A   B   10.0
#1  A   B   11.0
#3  A   C   4.0
#4  A   C   4.5
#6  A   D   100.0
#7  A   D   110.0

答案 1 :(得分:2)

我是这样做的:

df[df.groupby(['Org', 'Des']).Score.apply(lambda x: x < x.min() * 1.2)]

enter image description here