【问题标题】:Python groupby - change column values based on conditions in other columnsPython groupby - 根据其他列中的条件更改列值
【发布时间】:2020-10-15 06:02:04
【问题描述】:

我想先按“组”列分组。 然后根据结果列和排名列中的条件更改结果列中的值。

这就是我现在拥有的:

import pandas as pd
import numpy as np

group = ['g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2']
rank = ['1','2','3','4','5','1','2','3','4','5','6']
result = ['1','4','2','4','4','1','4','4','2','4','4']

df = pd.DataFrame({"group": group, "rank": rank, "result": result})

    group   rank    result
0   g1        1       1
1   g1        2       4
2   g1        3       2
3   g1        4       4
4   g1        5       4
5   g2        1       1
6   g2        2       4
7   g2        3       4
8   g2        4       2
9   g2        5       4
10  g2        6       4

在同一组中,当排名大于 result = 2 的排名时,我想将结果从 4 更改为 6
例如:在g1中,result = 2的rank是3。所以rank 4 & 5的结果是6。
在 g2 中,result = 2 的排名是 4。所以排名 5 和 6 的结果将是 6。

在这种情况下,我想要的输出将是:

    group   rank    result
0   g1        1       1
1   g1        2       4
2   g1        3       2
3   g1        4       6
4   g1        5       6
5   g2        1       1
6   g2        2       4
7   g2        3       4
8   g2        4       2
9   g2        5       6
10  g2        6       6

我不知道实现这一目标的最佳方法。有人可以帮忙吗?

提前致谢!

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    使用Series.whererank 替换为NaN 用于结果中与2 匹配的行,然后将GroupBy.transform 用于GroupBy.first 的每组重复值,最后比较Series.gt 和在DataFrame.loc中设置值6

    #convert to integers for correct compare values greater like '10'
    df[['rank','result']] = df[['rank','result']].astype(int)
    
    s = df['rank'].where(df['result'].eq(2)).groupby(df['group']).transform('first')
    
    df.loc[df['rank'].gt(s), 'result'] = 6
    print (df)
       group  rank  result
    0     g1     1       1
    1     g1     2       4
    2     g1     3       2
    3     g1     4       6
    4     g1     5       6
    5     g2     1       1
    6     g2     2       4
    7     g2     3       4
    8     g2     4       2
    9     g2     5       6
    10    g2     6       6
    

    【讨论】:

      【解决方案2】:

      这样就可以了

      import pandas as pd
      import numpy as np
      
      group = ['g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2']
      rank = ['1','2','3','4','5','1','2','3','4','5','6']
      result = ['1','4','2','4','4','1','4','4','2','4','4']
      
      df = pd.DataFrame({"group": group, "rank": rank, "result": result})
      
      def changeDf(x):
          df_gp = df[df['group'] == x['group']]
          rank_of_2 = df_gp.loc[df_gp['result'] =='2', 'rank'].values[0]
          if int(x['rank']) > int(rank_of_2):
              return '6'
          else:
              return x['result']
      
      df['result'] = df.apply(changeDf, axis=1)
      print(df)
      

      【讨论】:

      • 如果不匹配 '2' 则失败,也无法纠正更大的比较字符串,例如 10。因为例如'5' > '10'
      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 2020-07-04
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      相关资源
      最近更新 更多