吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 693|回复: 6
收起左侧

[求助] 求pandas移动最大值对应的index

[复制链接]
lizy169 发表于 2023-5-3 14:30
30吾爱币
[Python] 纯文本查看 复制代码
df = pd.DataFrame({
    "time": ['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10'],
    "weight": [20, 19, 28, 27, 24, 51, 23, 33, 37]},
)
df = df.set_index("time")
df['roll_max'] = df['weight'].rolling(window=3, min_periods=1).max()  # 移动3个数据最大值
df['roll_max_index'] = ''  # 需要得出移动最大值对应的index
print(df)


‘time'为index,
’roll_max'为3个数移动时最大的weight数值,
我要得到移动时最大的weight数值对应的index,不知道怎么算?
请大神帮助!

截图说明

截图说明

最佳答案

查看完整内容

代码中使用了一个字典来映射重量和时间,而字典的键必须是唯一的.如果有相同的重量出现在不同的时间,那么字典就会覆盖之前的值导致索引不正确.你可以尝试用numpy或pandas中的rolling方法来检查窗口中重复的值,例如 [mw_shl_code=python,true]import pandas as pd time = ['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10', '8:11'] weight = [20, 19, 28, 27, 24, 51, 23, 33, 37, 28] df = pd.D ...

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
yeal6 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hrh123 发表于 2023-5-3 14:30
本帖最后由 hrh123 于 2023-5-4 20:39 编辑
lizy169 发表于 2023-5-4 08:59
蟹蟹大神,我试了一下,这种方法如果后面再出现一个数据与前面相同的数据,就会出现错误,求大神继续帮忙 ...

代码中使用了一个字典来映射重量和时间,而字典的键必须是唯一的.如果有相同的重量出现在不同的时间,那么字典就会覆盖之前的值导致索引不正确.你可以尝试用numpy或pandas中的rolling方法来检查窗口中重复的值,例如
[Python] 纯文本查看 复制代码
import pandas as pd

time = ['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10', '8:11']
weight = [20, 19, 28, 27, 24, 51, 23, 33, 37, 28]

df = pd.DataFrame({
    "time": time,
    "weight": weight},
)
df = df.set_index("time")
df['roll_max'] = df['weight'].rolling(window=3, min_periods=1).max().astype(int)

def last_is_duplicate(a):
    if len(a) > 1:
        return a[-1] in a[:-1]
    else:
        return False

dup = df['weight'].rolling('10s').apply(last_is_duplicate).astype('bool')

df = df[~dup]

print(df)

或者
[Python] 纯文本查看 复制代码
import pandas as pd
import numpy as np

window = np.lib.stride_tricks.sliding_window_view(df['weight'], 3)

dup = np.apply_along_axis(last_is_duplicate, 1, window)

df = df[~dup]
Jack-lee 发表于 2023-5-3 18:16
[Python] 纯文本查看 复制代码
import pandas as pd
time=['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10']
weight=[20, 19, 28, 27, 24, 51, 23, 33, 37]
datamap=dict(zip(weight,time))
df = pd.DataFrame({
    "time": time,
    "weight": weight},
)
df = df.set_index("time")
df['roll_max'] = df['weight'].rolling(window=3, min_periods=1).max().astype(int)  
df['roll_max_index']=df['roll_max'].apply(lambda x:datamap[x])
print(df)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lizy169 + 1 + 1 谢谢@Thanks!

查看全部评分

hrh123 发表于 2023-5-3 18:28
本帖最后由 hrh123 于 2023-5-3 18:34 编辑

[Python] 纯文本查看 复制代码
df['roll_max_index'] = df.index[df['weight'].rolling(window=3, min_periods=1).apply(np.argmax)[2:].astype(int)+np.arange(len(df)-2)]
或者
[Python] 纯文本查看 复制代码
df['roll_max_index'] = df.rolling(3).apply(lambda x: x.idxmax())
亦或是
[Python] 纯文本查看 复制代码
maxidx = (df['weight'].values[np.arange(df['weight'].size-3+1)[:,None] + np.arange(3)]).argmax(1)
df['roll_max_index'] = df.index[maxidx+np.arange(maxidx.size)]

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lizy169 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| lizy169 发表于 2023-5-4 08:59
本帖最后由 lizy169 于 2023-5-4 09:01 编辑


蟹蟹大神,我试了一下,这种方法如果后面再出现一个数据与前面相同的数据,就会出现错误,求大神继续帮忙指点;


[Python] 纯文本查看 复制代码
import pandas as pd
time=['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10', '8:11']
weight=[20, 19, 28, 27, 24, 51, 23, 33, 37, 28]
datamap=dict(zip(weight,time))
df = pd.DataFrame({
    "time": time,
    "weight": weight},
)
df = df.set_index("time")
df['roll_max'] = df['weight'].rolling(window=3, min_periods=1).max().astype(int)
df['roll_max_index']=df['roll_max'].apply(lambda x:datamap[x])
print(df)

      weight  roll_max roll_max_index
time                                 
8:01      20        20           8:01
8:03      19        20           8:01
8:04      28        28           8:11
8:05      27        28           8:11
8:06      24        28           8:11
8:07      51        51           8:07
8:08      23        51           8:07
8:09      33        51           8:07
8:10      37        37           8:10
8:11      28        37           8:10
 楼主| lizy169 发表于 2023-5-5 11:05
后面我用的这种方式得到的索引,没有time列做索引
[Python] 纯文本查看 复制代码
import pandas as pd
time=['8:01', '8:03', '8:04', '8:05', '8:06', '8:07', '8:08', '8:09', '8:10', '8:11']
weight=[20, 19, 28, 27, 24, 51, 23, 33, 37, 28]

df = pd.DataFrame({
    "time": time,
    "weight": weight},
)

df['roll_max'] = df['weight'].rolling(window=3, min_periods=1).max().astype(int)
df['move_max_idx'] = df['weight'].rolling(window=3, min_periods=1).apply(lambda x: x.idxmax()).astype(int)  

print(df)
TenSir152 发表于 2023-5-10 09:28
学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-13 13:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表