Kakarotto_jack 2019-06-13 00:36 采纳率: 100%
浏览 357
已采纳

python!凭定位依据数据,对被定位数据前边和后边的数据分别求最值? 待大神!需要您给个代码哈!谢谢

python问题:df 在groupby 后,凭定位依据数据,对被定位数据前边和后边的数据分别求最值? 待大神!需要您给个代码哈!谢谢

a = pd.DataFrame({'year':[2018,2018,2018,2019,2019,2019,2019,2020,2020,2020,2020],'BoolCol': [1.2, 2.4, 3.7, 3.41, 4.58, 3.41, 4.0, 3.0, 7.0, 9.1, 7.0]})

b=pd.DataFrame({'year':[2018,2019,2020],'BoolCol': [1.2, 4.58, 7.0]})

#以上是数据简例,实际数据多,
问题是,我想先依据 b中的'BoolCol'的[1.2, 4.58, 7.0]数据作为定位依据数据。接着,对a按'year'进行groupby后,找出a的'BoolCol'列的每个group中的被定位数据,最终分别求出被定位数据之前的数据中的最大值;和被定位数据之后的数据中的最大值。
#例如a在groupby后,b中定位依据数据7.0对应的就应是a中的2020年的 'BoolCol'列中[3.0, 7.0, 9.1, 7.0]这样的数据list,这里假定要求定位依据数据7.0对应的被定位数据就是在list中的第一次出现的7.0(因为确实有可能多次出现同一数据,所以这里指定为首次出现的数据为被定位数据),之后再找出list中这个7.0前边的数据里的最大值,这里实际应该是3.0,但同时,若7.0就是第一个数据的时候,那么就指定7.0是应被找出的数值(最大值)。

这样被定位数据之前的数据中的最大值,应为一列数据[1.2, 3.41, 3.0]
同理!!被定位数据之后的数据中的最大值 ,应为一列数据[3.7, 4.0, 9.1] 以上为数据简例,实际数据较多
望有python大神现身,大神啊,需要给个代码哈!!!求助中!!!

  • 写回答

3条回答 默认 最新

  • Next66 2019-06-13 11:00
    关注

    直接上代码,亲测可用

    import pandas as pd
    import numpy as np
    
    a = pd.DataFrame({'year':[2018,2018,2018,2019,2019,2019,2019,2020,2020,2020,2020],'BoolCol': [1.2, 2.4, 3.7, 3.41, 4.58, 3.41, 4.0, 3.0, 7.0, 9.1, 7.0]})
    b = pd.DataFrame({'year':[2018,2019,2020],'BoolCol': [1.2, 4.58, 7.0]})
    c = a.groupby('year')
    
    b_left_max = []
    b_right_max = []
    
    for index,row in b.iterrows():
        year = row['year']
        boolcol = row['BoolCol']
        d = c.get_group(year)
        l = np.array(d['BoolCol']).tolist()
        e = l.index(boolcol)
        list_len = len(l)
        left = max(l[0:e]) if l[0:e] else boolcol
        right = max(l[e+1:list_len]) if l[e+1:list_len] else boolcol
    
        b_left_max.append(left)
        b_right_max.append(right)
    
    print(b_left_max)
    print(b_right_max)
    
    

    结果
    图片说明

    之前有人说用循环慢,那再改进一下:

    import pandas as pd
    
    def hander(record):
        year,boolcol = record
        src_list = c.get_group(year)['BoolCol'].tolist()
        index = src_list.index(boolcol)
        list_len = len(src_list)
        left = max(src_list[0:index]) if src_list[0:index] else boolcol
        right = max(src_list[index+1:list_len]) if src_list[index+1:list_len] else boolcol
        return [left,right]
    
    a = pd.DataFrame({'year':[2018,2018,2018,2019,2019,2019,2019,2020,2020,2020,2020],'BoolCol': [1.2, 2.4, 3.7, 3.41, 4.58, 3.41, 4.0, 3.0, 7.0, 9.1, 7.0]})
    b = pd.DataFrame({'year':[2018,2019,2020],'BoolCol': [1.2, 4.58, 7.0]})
    c = a.groupby('year')
    
    result = b.apply(hander, axis=1,result_type="expand")
    
    b_left_max = result[0].tolist()
    b_right_max = result[1].tolist()
    
    print(b_left_max, b_right_max)
    

    运行结果是一样的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值