【问题标题】:Update values in one dataframe using values from another as the row index for the first使用另一个数据框中的值作为第一个数据框中的行索引来更新一个数据框中的值
【发布时间】:2021-10-23 09:51:16
【问题描述】:

数据框:

# frames
winter1 = pd.DataFrame({"Location #1":{"1":0.999103,"2":0.999103,"3":0.999103,"4":0.999103,"5":0.999103,"6":0.999103,"7":0.999103,"8":0.999103,"9":0.999103,"10":0.999103,"11":0.999103,"12":0.999103,"13":0.999103,"14":0.999103,"15":0.999103,"16":0.999103,"17":0.999103,"18":0.999103,"19":0.999103,"20":0.999103,"21":0.999103,"22":0.999103,"23":0.999103,"24":0.999103},"Location #2":{"1":1.001673,"2":1.001673,"3":1.001673,"4":1.001673,"5":1.001673,"6":1.001673,"7":1.001673,"8":1.001673,"9":1.001673,"10":1.001673,"11":1.001673,"12":1.001673,"13":1.001673,"14":1.001673,"15":1.001673,"16":1.001673,"17":1.001673,"18":1.001673,"19":1.001673,"20":1.001673,"21":1.001673,"22":1.001673,"23":1.001673,"24":1.001673},"Location #3":{"1":0.999382,"2":0.999382,"3":0.999382,"4":0.999382,"5":0.999382,"6":0.999382,"7":0.999382,"8":0.999382,"9":0.999382,"10":0.999382,"11":0.999382,"12":0.999382,"13":0.999382,"14":0.999382,"15":0.999382,"16":0.999382,"17":0.999382,"18":0.999382,"19":0.999382,"20":0.999382,"21":0.999382,"22":0.999382,"23":0.999382,"24":0.999382},"Location #4":{"1":0.998544,"2":0.998544,"3":0.998544,"4":0.998544,"5":0.998544,"6":0.998544,"7":0.998544,"8":0.998544,"9":0.998544,"10":0.998544,"11":0.998544,"12":0.998544,"13":0.998544,"14":0.998544,"15":0.998544,"16":0.998544,"17":0.998544,"18":0.998544,"19":0.998544,"20":0.998544,"21":0.998544,"22":0.998544,"23":0.998544,"24":0.998544},"Location #5":{"1":1.00267,"2":1.00267,"3":1.00267,"4":1.00267,"5":1.00267,"6":1.00267,"7":1.00267,"8":1.00267,"9":1.00267,"10":1.00267,"11":1.00267,"12":1.00267,"13":1.00267,"14":1.00267,"15":1.00267,"16":1.00267,"17":1.00267,"18":1.00267,"19":1.00267,"20":1.00267,"21":1.00267,"22":1.00267,"23":1.00267,"24":1.00267}})

df_winter_min_error = pd.DataFrame({"Location #1":{"Position of min value":2,"Position of max value":19},"Location #2":{"Position of min value":4,"Position of max value":19},"Location #3":{"Position of min value":5,"Position of max value":15},"Location #4":{"Position of min value":5,"Position of max value":20},"Location #5":{"Position of min value":7,"Position of max value":20}})

我有一个名为 winter1 的 pandas 数据框,如下所示。它由五个不同位置的 24 小时值组成。

Location #1 Location #2 Location #3 Location #4 Location #5
Hours                   
1   0.999103    1.001673    0.999382    0.998544    1.00267
2   0.999103    1.001673    0.999382    0.998544    1.00267
3   0.999103    1.001673    0.999382    0.998544    1.00267
4   0.999103    1.001673    0.999382    0.998544    1.00267
5   0.999103    1.001673    0.999382    0.998544    1.00267
6   0.999103    1.001673    0.999382    0.998544    1.00267
7   0.999103    1.001673    0.999382    0.998544    1.00267
8   0.999103    1.001673    0.999382    0.998544    1.00267
9   0.999103    1.001673    0.999382    0.998544    1.00267
10  0.999103    1.001673    0.999382    0.998544    1.00267
11  0.999103    1.001673    0.999382    0.998544    1.00267
12  0.999103    1.001673    0.999382    0.998544    1.00267
13  0.999103    1.001673    0.999382    0.998544    1.00267
14  0.999103    1.001673    0.999382    0.998544    1.00267
15  0.999103    1.001673    0.999382    0.998544    1.00267
16  0.999103    1.001673    0.999382    0.998544    1.00267
17  0.999103    1.001673    0.999382    0.998544    1.00267
18  0.999103    1.001673    0.999382    0.998544    1.00267
19  0.999103    1.001673    0.999382    0.998544    1.00267
20  0.999103    1.001673    0.999382    0.998544    1.00267
21  0.999103    1.001673    0.999382    0.998544    1.00267
22  0.999103    1.001673    0.999382    0.998544    1.00267
23  0.999103    1.001673    0.999382    0.998544    1.00267
24  0.999103    1.001673    0.999382    0.998544    1.00267

根据另一个名为 df_winter_min_error 的 pandas 数据框的两行中的值,某些 Hours 的某些列的值需要为 1,如下所示:

df_winter_min_error.iloc[-2:,:]

Location #1 Location #2 Location #3 Location #4 Location #5
Hours                   
Position of min value   2.0 4.0 5.0 5.0 7.0
Position of max value   19.0    19.0    15.0    20.0    20.0

根据上面df_winter_min_error中的值,需要将winter1中的具体值改为1。例如对于位置 #1,最小值和最大值的位置分别为 2 小时和 19 小时。因此,我需要通过替换现有值将 Winter1.loc[2,"Location #1] 和 winter1.loc[19,"Location #1] 的值设为 1。我想自动化这个过程,因为它也需要在相应的时间在所有位置完成。

我尝试了以下代码,但是,它似乎没有改变任何东西。我也尝试修改代码,但是导致了 KeyError 和 IndexingError 等不同的错误。

locations = ["Location #1", "Location #2","Location #3","Location #4","Location #5"]
for location in locations:
    for index, row in winter1.iterrows():
        for location in locations:
            if [index] in df_winter_min_error[location][-2:].astype(int).values.tolist():
                row.loc[index,location]=1

什么是自动化这个过程的合适方法,因为它需要应用于每一行(小时)和每一列(位置)?

【问题讨论】:

    标签: python python-3.x pandas dataframe for-loop


    【解决方案1】:

    也许,考虑到:

    # frames
    winter1 = pd.DataFrame({"Location #1":{"1":0.999103,"2":0.999103,"3":0.999103,"4":0.999103,"5":0.999103,"6":0.999103,"7":0.999103,"8":0.999103,"9":0.999103,"10":0.999103,"11":0.999103,"12":0.999103,"13":0.999103,"14":0.999103,"15":0.999103,"16":0.999103,"17":0.999103,"18":0.999103,"19":0.999103,"20":0.999103,"21":0.999103,"22":0.999103,"23":0.999103,"24":0.999103},"Location #2":{"1":1.001673,"2":1.001673,"3":1.001673,"4":1.001673,"5":1.001673,"6":1.001673,"7":1.001673,"8":1.001673,"9":1.001673,"10":1.001673,"11":1.001673,"12":1.001673,"13":1.001673,"14":1.001673,"15":1.001673,"16":1.001673,"17":1.001673,"18":1.001673,"19":1.001673,"20":1.001673,"21":1.001673,"22":1.001673,"23":1.001673,"24":1.001673},"Location #3":{"1":0.999382,"2":0.999382,"3":0.999382,"4":0.999382,"5":0.999382,"6":0.999382,"7":0.999382,"8":0.999382,"9":0.999382,"10":0.999382,"11":0.999382,"12":0.999382,"13":0.999382,"14":0.999382,"15":0.999382,"16":0.999382,"17":0.999382,"18":0.999382,"19":0.999382,"20":0.999382,"21":0.999382,"22":0.999382,"23":0.999382,"24":0.999382},"Location #4":{"1":0.998544,"2":0.998544,"3":0.998544,"4":0.998544,"5":0.998544,"6":0.998544,"7":0.998544,"8":0.998544,"9":0.998544,"10":0.998544,"11":0.998544,"12":0.998544,"13":0.998544,"14":0.998544,"15":0.998544,"16":0.998544,"17":0.998544,"18":0.998544,"19":0.998544,"20":0.998544,"21":0.998544,"22":0.998544,"23":0.998544,"24":0.998544},"Location #5":{"1":1.00267,"2":1.00267,"3":1.00267,"4":1.00267,"5":1.00267,"6":1.00267,"7":1.00267,"8":1.00267,"9":1.00267,"10":1.00267,"11":1.00267,"12":1.00267,"13":1.00267,"14":1.00267,"15":1.00267,"16":1.00267,"17":1.00267,"18":1.00267,"19":1.00267,"20":1.00267,"21":1.00267,"22":1.00267,"23":1.00267,"24":1.00267}})
    
    df_winter_min_error = pd.DataFrame({"Location #1":{"Position of min value":2,"Position of max value":19},"Location #2":{"Position of min value":4,"Position of max value":19},"Location #3":{"Position of min value":5,"Position of max value":15},"Location #4":{"Position of min value":5,"Position of max value":20},"Location #5":{"Position of min value":7,"Position of max value":20}})
    

    作为winter1 的样本,看起来像..

        Location #1     Location #2     Location #3     Location #4     Location #5
    2   0.999103        1.001673        0.999382        0.998544        1.00267
    19  0.999103        1.001673        0.999382        0.998544        1.00267
    

    还有df_winter_min_error:

                            Location #1     Location #2     Location #3     Location #4     Location #5
    Position of min value   2               4               5               5               7
    Position of max value   19              19              15              20              20
    

    要更改所有列,请尝试:

    for col in winter1.columns:
        mask = winter1.index.isin(df_winter_min_error[col].astype(str))
        winter1[col][mask] = 1
    

    winter1 的输出样本:

    winter1.loc[['2', '4', '5', '7', '15', '19', '20']]
    
        Location #1     Location #2     Location #3     Location #4     Location #5
    2   1.000000 <      1.001673        0.999382        0.998544        1.00267
    4   0.999103        1.000000 <      0.999382        0.998544        1.00267
    5   0.999103        1.001673        1.000000 <      1.000000 <      1.00267
    7   0.999103        1.001673        0.999382        0.998544        1.00000 <
    15  0.999103        1.001673        1.000000 <      0.998544        1.00267
    19  1.000000 <      1.000000 <      0.999382        0.998544        1.00267
    20  0.999103        1.001673        0.999382        1.000000 <      1.00000 <
    

    【讨论】:

    • 谢谢。这对我有用。 Winter1.index 的类型为 int。所以我也转换了df_winter_min_error[col].astype(int),它是float类型的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2021-06-06
    • 2018-02-12
    • 2022-11-27
    • 2021-10-14
    相关资源
    最近更新 更多