gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:05 25 4
gpt4 key购买 nike

我试图在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com