【问题标题】:Set value of DataFrame column based on value of other columns & rows根据其他列和行的值设置 DataFrame 列的值
【发布时间】:2022-09-27 16:09:44
【问题描述】:

我有一个 DataFrame df 有四列; DateLocationCategoryValue。对于每个DateLocation,我尝试将Value 列中包含另一列Category 中的值的值更改为5 或更高,并将其替换为Category 行的值5.

df:
Date       Location  Category  Value
20220101   FE        1         0.23
20220101   FE        2         0.24
20220101   FE        3         0.26
20220101   FE        4         0.27
20220101   FE        5         0.28
20220101   FE        6         0.30
20220101   RP        5         0.32
20220101   RP        6         0.35
20220102   FE        1         0.20
20220102   FE        2         0.23
20220102   FE        3         0.25
20220102   FE        4         0.26
20220102   FE        5         0.28
20220102   FE        6         0.32
df_new:
Date       Location  Category  Value
20220101   FE        1         0.23
20220101   FE        2         0.24
20220101   FE        3         0.26
20220101   FE        4         0.27
20220101   FE        5         0.28
20220101   FE        6         0.28 <-- changed with value from row with Category == 5
20220101   RP        5         0.32
20220101   RP        6         0.32 <-- changed with value from row with Category == 5
20220102   FE        1         0.20
20220102   FE        2         0.23
20220102   FE        3         0.25
20220102   FE        4         0.26
20220102   FE        5         0.28
20220102   FE        6         0.28 <-- changed with value from row with Category == 5

到目前为止,我只能提取特定DateValueCategory = 5 的Location

df.loc[(df[\'Date\'] == 20220101) & (df[\'Location\'] == \'FE\') & (df[\'Category\'] == 5), \'Value\'].iloc[0]

有没有一种简单有效的方法来更改Value 列中的列值?非常感谢!

为了重现性:

df = pd.DataFrame({
    \'Date\':[20220101, 20220101, 20220101, 20220101, 20220101, 20220101, 20220101, 20220101, 20220102, 20220102, 20220102, 20220102, 20220102, 20220102, 20220102, 20220102],
    \'Location\':[\'FE\', \'FE\', \'FE\', \'FE\', \'FE\', \'FE\', \'RP\', \'RP\', \'FE\', \'FE\', \'FE\', \'FE\', \'FE\', \'FE\', \'RP\', \'RP\'],
    \'Category\':[1, 2, 3, 4, 5, 6, 5, 6, 1, 2, 3, 4, 5, 6, 5, 6],
    \'Value\':[0.23, 0.24, 0.26, 0.27, 0.28, 0.3, 0.32, 0.35, 0.2, 0.23, 0.25, 0.26, 0.28, 0.32, 0.34, 0.36]
})

    标签: python pandas dataframe


    【解决方案1】:

    假设类别按每个组升序排列,您可以 mask 类别 > 5 的值和 groupby.ffill

    df['Value'] = (df['Value'].mask(df['Category'].gt(5))
                   .groupby([df['Date'], df['Location']])
                   .ffill()
                  )
    

    输出(作为新列 Value2 进行比较):

            Date Location  Category  Value  Value2
    0   20220101       FE         1   0.23    0.23
    1   20220101       FE         2   0.24    0.24
    2   20220101       FE         3   0.26    0.26
    3   20220101       FE         4   0.27    0.27
    4   20220101       FE         5   0.28    0.28
    5   20220101       FE         6   0.30    0.28
    6   20220101       RP         5   0.32    0.32
    7   20220101       RP         6   0.35    0.32
    8   20220102       FE         1   0.20    0.20
    9   20220102       FE         2   0.23    0.23
    10  20220102       FE         3   0.25    0.25
    11  20220102       FE         4   0.26    0.26
    12  20220102       FE         5   0.28    0.28
    13  20220102       FE         6   0.32    0.28
    14  20220102       RP         5   0.34    0.34
    15  20220102       RP         6   0.36    0.34
    

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 2020-11-04
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多