python - 使用条件在 python pandas 中进行内部连接

标签 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 * min) = 12。因此第 0 行和第 1 行将被保留,因为分数 10 和 11 < 12。第 3 行将被淘汰,因为它大于 12。

对于 A-C,最小分数为 4 且 (1.2 * min) = 5。因此保留第 3 行和第 4 行,因为它们 < 5。依此类推...

我的方法

我想我会使用以下方法:

  1. 使用 groupby 函数通过 Org-Des 对创建一个数据框:

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

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

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

编辑以反射(reflect)@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?我更改了原始答案帖子以匹配代码。

最佳答案

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

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

关于python - 使用条件在 python pandas 中进行内部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38276374/

相关文章:

python - 如何有效地将 tsv 文件中的数组列读取到每个列的单个 npz 文件中?

python - 将 Pandas 数据框转换为带有标题和数据类型的 numpy 数组

mysql - 选择在另一个表中查找名称

python - 这个 IRR 的实现中使用的数值方法是什么?

python - 将成绩的连续值转换为类别

mysql - 在mysql查询中用null连接三个子查询结果集

python - 选择具有非零值且在 pandas 中共享索引且无循环的列

python - 是否可以使用 python pandas 通过循环构建投资组合?

python - 元组索引超出范围python

Python/PyGame : Find pixel by colorcode