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)

代码解释:

  1. 第一步:

    • 筛选 df0 中 num 等于 1 的数据,并将其赋值给变量 df
    • 使用 groupby('B')dfB 列进行分组,并使用 transform('min') 求取每个分组中 Acc 列的最小值,并将其赋值给 accessMin 列。
    • 同样,使用 transform('min') 求取每个分组中 AccD 列的最小值,并将其赋值给 accessMinD 列。
  2. 第二步:

    • 使用 groupby('B')df1B 列进行分组,并使用循环遍历每个分组。
    • 对于每个分组 group,使用 group['Acc'] > df.loc[df['B']==name, 'accessMin'].item() 筛选 groupAcc 值大于对应分组 dfaccessMin 值的行。
    • 将筛选后的数据赋值给变量 df_temp,并将对应分组 dfaccessMinaccessMinD 的值分别赋值给 df_tempaccessMinaccessMinD 列。
    • 使用 pd.concat([result, df_temp])df_temp 合并到 result 中。

最终,result 将包含 df1 中满足条件的数据,并包含对应分组 df 中的 accessMinaccessMinD 值。


原文地址: https://www.cveoy.top/t/topic/n8kC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录