【问题标题】:Looking Alternative other than Loops寻找循环以外的替代方案
【发布时间】:2021-05-11 13:21:14
【问题描述】:

我有一个数据框:

df=
year_month  data
(1970,1)     12
(1970,1)     15
(1970,1)      3
(1970,2)     32
(1970,2)     28

我想对每个 year_month 的数据进行排名,然后将每个排名除以每组中的数据数加 1,结果是:

result=

year_month  data
(1970,1)     0.5
(1970,1)     0.75
(1970,1)     0.25
(1970,2)     0.67
(1970,2)     0.33

解释:例如第2行:year_month为(1970,1),数据为15。在(1970,1)内,数据15排在第3位除以4(( 1970,1) +1),结果为 0.75。

我目前的方法是使用 for 循环

df_ = []
for ym in yy_mm:
    df1 = df.loc(df.yy_mm == ym)
     n  = df1.shape[0]
    df1 = df1.rank()/n
    df_.append(df1) 

df_result = pd.concat(df)     

这可行,但我正在寻找任何其他更有效的方式。使用循环很慢,特别是它是一个更大的数据。提前致谢。

【问题讨论】:

    标签: pandas performance dataframe loops


    【解决方案1】:

    四步流程

    1. 使用groupby() 然后rank() 获得排名
    2. 使用translate() 获取groupby() 中的最大排名以获取系列
    3. 按要求计算数据
    4. 清理工作...
    df = pd.read_csv(io.StringIO("""year_month  data
    (1970,1)     12
    (1970,1)     15
    (1970,1)      3
    (1970,2)     32
    (1970,2)     28"""), sep="\s+")
    
    df2 = df.assign(r=df.groupby("year_month")["data"].rank(),
             mr=lambda dfa: dfa.groupby("year_month")["r"].transform("max"),
             data=lambda dfa: dfa.r / (dfa.mr+1)).drop(columns=["r","mr"])
    
    
    year_month data
    0 (1970,1) 0.5
    1 (1970,1) 0.75
    2 (1970,1) 0.25
    3 (1970,2) 0.666667
    4 (1970,2) 0.333333

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多