我正在尝试在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行被保留,因为它们是<等等......
我的方法
我以为我会使用以下方法:
使用groupby函数通过Org-Des对创建一个包含分钟的数据帧:
dataframe2 = pd.DataFrame(dataframe1.groupby(['Org','Des'])['Score'].min())
然后在dataframe1和dataframe2之间进行内部联接(或合并?),条件是<每个Org-Des对类型为1.2 * min。
但由于两个原因,我无法让这个工作,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混淆了吗?我改变了原来的答案帖子以匹配代码。
答案 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)