【发布时间】:2016-11-11 14:18:35
【问题描述】:
我试图在 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 组合 AB,最小分数为 10 且 (1.2 * min) = 12。因此第 0 行和第 1 行将被保留,因为分数 10 和 11 小于 12。第 3 行将被删除,因为大于 12。
对于 A-C,最小分数为 4 且 (1.2 * min) = 5。因此第 3 行和第 4 行被保留,因为它们
我的方法
我想我会使用以下方法:
-
使用 groupby 函数通过 Org-Des 对创建具有 mins 的数据框:
dataframe2 = pd.DataFrame(dataframe1.groupby(['Org','Des'])['Score'].min()) 然后在 dataframe1 和 dataframe2 之间进行内部连接(或合并?),标准是每个 Org-Des 对类型的 Score
但是由于两个原因,我无法让它工作,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 搞混了?我从原始答案帖子更改以匹配代码。
【问题讨论】:
标签: python pandas join merge group-by