[英]Python Pandas - filter pandas dataframe to get rows with minimum values in one column for each unique value in another column
[英]Get values from one column corresponding to the minimum value of another column for a subset of rows
如果问题不完全清楚,请道歉。 但是,我确实有一些示例代码显示所需的输入和 output(见下文)。
我有一个(大)pandas dataframe 并想要 select 中的最小值和相应的滞后。 我还想 select pval2 中的最小值和相应的滞后。 我想对每对变量(即(A 和 B)、(A 和 C)和(B 和 D))执行此操作。 每对变量在数据集中出现多次。
我已经尝试了几种方法来尝试获得我想要的 output,但似乎缺少一些逻辑明智的东西,我不太确定是什么。 任何帮助将不胜感激。
感谢任何帮助的人!
dataframe 看起来像这样:
myxdf = pd.DataFrame({
'pval1': [0.01,0.2,0.001,0.3,0.0003,0.05,1,0.002,0.2],
'pval2': [0.3,0.02,0.002,0.9,0.001,0.002,0.10,0.93,0.00001],
'lag': [1,2,3,1,2,3,1,2,3],
'var1': ['A','A','A','A','A','A','B','B','B'],
'var2': ['B','B','B','C','C','C','D','D','D']
})
myxdf
对于上述示例,我想要的 output 理想情况下应该是这样的(请注意新的 lag1 和 lag2 列):
myxdf2 = pd.DataFrame({
'pval1': [0.0010,0.0003,0.002],
'pval2' : [0.002,0.001,0.00001],
'lagp1': ['3','2','2'],
'lagp2': ['3','2','3'],
'var1': ['A','A','B'],
'var2': ['B','C','D']
})
myxdf2
我相信您需要DataFrameGroupBy.idxmin
用于最小值索引,将其用于 select 行,重命名列并通过concat
连接:
df = myxdf.groupby(['var1','var2'])[['pval1', 'pval2']].idxmin()
df1 = myxdf.loc[df['pval1'], ['pval1','lag']].rename(columns={'lag':'lagp1'})
df2 = myxdf.loc[df['pval2'], ['pval2','lag','var1','var2']].rename(columns={'lag':'lagp2'})
df = pd.concat([df1.reset_index(drop=True), df2.reset_index(drop=True)], axis=1)
cols = ['pval1', 'pval2', 'lagp1', 'lagp2', 'var1', 'var2']
df = df[cols]
print (df)
pval1 pval2 lagp1 lagp2 var1 var2
0 0.0010 0.00200 3 3 A B
1 0.0003 0.00100 2 2 A C
2 0.0020 0.00001 2 3 B D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.