Pandas 数据分组筛选:根据分组最小值筛选另一数据框
import pandas as pd
df0 = pd.DataFrame({'E': [20, 34, 30, 1],
'B': ['a', 'c', 'a', 'c'],
'num': [1, 2, 1, 1],
'D': ['b', 'b', 'b', 'b'],
'Acc': [200, 100, 30, 50],
'AccD': [-5, 105, -30, 50]})
df1 = pd.DataFrame({'E': [25, 34, 30, 1],
'B': ['a', 'c', 'a', 'c'],
'num': [1, 2, 2, 1],
'D': ['b', 'b', 'b', 'b'],
'Acc': [220, 110, 130, 50],
'AccD': [-5, 105, -30, 50]})
# 第一步、取df0['num']==1的数据,按B分组并将acc最小的值赋给accessMin
df=df0[df0['num']==1]
df['accessMin'] = df.groupby(['B'])['Acc'].transform('min')
df['accessMinD'] = df.groupby(['B'])['AccD'].transform('min')
# 第二步、按B对df1、df分组,对df1进行取数,取对应分组中df1的Acc比df中accessMin大的数据.
df1_grouped = df1.groupby('B')
result = pd.DataFrame()
for name, group in df1_grouped:
df_temp = group[group['Acc'] > df.loc[df['B']==name, 'accessMin'].item()]
df_temp['accessMin'] = df.loc[df['B']==name, 'accessMin'].item()
df_temp['accessMinD'] = df.loc[df['B']==name, 'accessMinD'].item()
result = pd.concat([result, df_temp])
print(result)
代码解释:
-
第一步:
- 筛选 df0 中
num等于 1 的数据,并将其赋值给变量df。 - 使用
groupby('B')对df按B列进行分组,并使用transform('min')求取每个分组中Acc列的最小值,并将其赋值给accessMin列。 - 同样,使用
transform('min')求取每个分组中AccD列的最小值,并将其赋值给accessMinD列。
- 筛选 df0 中
-
第二步:
- 使用
groupby('B')对df1按B列进行分组,并使用循环遍历每个分组。 - 对于每个分组
group,使用group['Acc'] > df.loc[df['B']==name, 'accessMin'].item()筛选group中Acc值大于对应分组df中accessMin值的行。 - 将筛选后的数据赋值给变量
df_temp,并将对应分组df中accessMin和accessMinD的值分别赋值给df_temp的accessMin和accessMinD列。 - 使用
pd.concat([result, df_temp])将df_temp合并到result中。
- 使用
最终,result 将包含 df1 中满足条件的数据,并包含对应分组 df 中的 accessMin 和 accessMinD 值。
原文地址: https://www.cveoy.top/t/topic/n8kC 著作权归作者所有。请勿转载和采集!