python 定位/修改DataFrame类型中某一值 根据相对时间的先后顺序来寻找参数值

需求描述:
现在有一条生产线在生产一种产品,生产线上不同生产参数的数值会在许许多多的时间点上被记录,产品被生产出来时会有相对应的生产时间。对于产品A,小于其生产时间、并且离其生产时间最近的各个被记录的生产参数就是产品A所对应的生产参数。
提供生产表:parameter.xlsx 其中包含各个时间点、记录的参数名称以及参数值
提供产品表:ID_concat.xlsx 其中包含各个产品的生产时间

使用ID[y][i] = stove['value'][j]的形式来更改DataFrame类型的某一个具体值,其中y是列名,i是行数。

ID.iloc[i][n]用于定位某一个具体值,其中i是行数,n是列数。

import numpy as np 
import pandas as pd
from datetime import *


stove_file = 'parameter.xlsx'
id_file = 'ID_concat.xlsx'


def find_value_from_stove(stove_file, id_file):
    """
    stove_file: 按照时间先后顺序排序之后的参数文件
    id_file: 按照时间先后顺序排序之后的Product_ID文件
    return:DataFrame类型的、带有生产参数的Product数据
    """
    ID = pd.read_excel(id_file)  #  sorted
    #print(ID)
    stove = pd.read_excel(stove_file)  #  sorted
    index = 0
    for i in range(ID.shape[0]):
        print(i)
        #print(len(ID))
        #datetime.strptime("2016-06-07", "%Y-%m-%d")  
        end_time = int(ID['ts'][i].strftime('%Y%m%d%H%M%S'))
        for j in range(index, len(stove)):
            print(i,j)
            now_time = int(stove['ts'][j].strftime('%Y%m%d%H%M%S'))
            #print(end_time, now_time)
            if(now_time<end_time):
                y= stove['tagname'][j]
                #print(y)
                for n, k in enumerate(ID):
                    if y == k:#找到相同的参数列
                        #print(y,k)
                        print(ID.iloc[i][n], stove['value'][j])#修改之前的值
                        ID[y][i] = stove['value'][j]
                        print(ID.iloc[i][n], stove['value'][j])#修改之后的值
            else: 
                index = j#更改查询范围
                print(index)
                if(i<ID.shape[0]-1):
                    for m, n in enumerate(ID):
                        if m>2:#在该文件中第四列以及之后才是参数列
                            ID[n][i+1] = ID.iloc[i][m]
                        
                break
    return ID
ID = find_value_from_stove(stove_file, id_file)
ID = ID.to_excel("product_with_values.xlsx",index=0) 
<think>嗯,用户问的是在Python中如何按DataFrame行的进行排序。首先,我需要回忆下pandas库里的排序方法。记得pandas主要有两种排序方式:按索引排序和按排序。这里用户需要按某行的,所以应该是按排序,使用sort_values()方法。 不过,通常sort_values()是按列或者行来排序的。默认情况下,sort_values是按列进行排序的,也就是axis=0,这样会根据指定列的对行进行排序。但用户这里需要按某行的来排序,也就是可能需要对列进行排序,这时候可能需要调整axis参数。 比如,假设有一个DataFrame,用户想根据行(比如第二行)的来对列进行排序。这时候需要设置axis=1,也就是按行排序,然后指定特定的行索引。但要注意,sort_values中的by参数通常需要指定标签,所以可能需要先提取该行的索引,或者使用.loc来定位。 但有时候可能会混淆行和列的排序方向。比如,如果DataFrame是df,想要按行名为'row_name'的这行的对列进行排序,应该使用axis=1,并且by参数可能需要传入该行的索引位置或者标签。不过,实际测试中可能发现,直接使用by参数可能会报错,因为按行排序时,by需要指定列名,所以可能需要转置DataFrame,然后按列排序,再转置回来。 或者,更简单的方法是使用sort_values并指定axis=1,然后by参数传入该行的索引。例如,df.sort_values(by='row_label', axis=1)。但需要确保该行确实存在,并且axis参数正确。 可能用户的需求是对列进行排序,根据行中的。这时候正确的做法是转置DataFrame,然后按该行对应的列进行排序,再转置回来。比如,df.T.sort_values(by='row_label').T。这样可以避免axis参数的问题,因为转置后原来的行变为列,就可以直接用sort_values按列排序。 不过需要举一个具体的例子来说明这个过程。比如创建一个示例DataFrame,展示如何按某行排序。同时,提醒用户注意数据类型,如果该行包含非数类型,可能会导致排序错误。另外,inplace参数的使用是否需要,或者是否应该返回新的DataFrame。 可能还需要提到ascending参数来控制升序或降序,以及如何处理缺失。此外,如果用户想按多行的排序,可能需要使用key参数或者其他方法,但用户的问题可能只涉及单行。 总结步骤应该是: 1. 确定要按哪行的排序。 2. 使用转置方法将行转换为列。 3. 使用sort_values按对应的列排序。 4. 再次转置回来,恢复原始结构。 或者直接使用axis=1和by参数指定行索引,但需要确认pandas版本是否支持。例如,df.sort_values(by=行索引, axis=1)。不过可能需要用iloc来定位行号,比如by=df.index[2]。 需要检查具体的语法是否正确,可能实际测试下代码。比如,假设有一个df: ``` A B C 0 3 1 4 1 2 5 7 ``` 如果用户想按第0行的对列排序,排序后的列顺序应该是B, A, C(因为1,3,4),所以升序排列的话应该是B(1), A(3), C(4)。这时候使用df.sort_values(by=0, axis=1)是否能得到正确结果?测试下,应该可以,因为axis=1表示按行方向排序,by=0表示用索引为0的行来排序各列。 所以可能不需要转置,直接使用axis=1和by参数指定行索引即可。这样的话,步骤更简单,不需要转置。 因此,正确的做法是使用sort_values,并设置axis=1,然后by参数为行索引。例如: df.sort_values(by=行标签或索引位置, axis=1, ascending=True/False) 需要注意,如果使用行标签(如索引名称),可以直接传入;如果是按行位置,比如第n行,可能需要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值