【问题标题】:An efficient way to add a new column to Pandas dataframe based on sub-groups of another column基于另一列的子组向 Pandas 数据框添加新列的有效方法
【发布时间】:2021-07-14 17:48:57
【问题描述】:

我有一个包含如下各列的数据框:

import numpy as np
import pandas as pd

d = {'X': [1.1, 1.2, 1.3, 2.1, 2.2, 2.3],
     'Group Index': [1, 1, 1, 2, 2, 2],
     'Score': [1, 2, 3, 10, 20, 30]}
df = pd.DataFrame(data=d)
print(df)


 X    Group Index  Score
1.1        1         1
1.2        1         2
1.3        1         3
2.1        2        10
2.2        2        20
2.3        2        30

我使用“apply”和“lambda”创建一个新列来填充具有相同“组索引”的每一行的范围(例如,max-min)

df.loc[:,'Score Range'] = df.apply (lambda row: np.ptp(df[(df['Group Index']==row['Group Index'])]['Score']), axis=1)
print(df)

 X   Group Index  Score  Score Range
1.1       1         1         2
1.2       1         2         2
1.3       1         3         2
2.1       2        10        20
2.2       2        20        20
2.3       2        30        20

“lambda”和“apply”可以工作,但是太慢了。还有其他更好的方法来加快生成上述新列(分数范围)吗?

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    那么让我们试试transform + groupby

    df['Score Range'] = df.groupby('Group Index')['Score'].transform(np.ptp)
    

    【讨论】:

      【解决方案2】:

      你也可以试试lazy groupby:

      groups = df.groupby('Group Index')['Score']
      df['Score Range'] = groups.transform('max') - groups.transform('min')
      

      【讨论】:

        猜你喜欢
        • 2020-12-20
        • 2016-12-21
        • 1970-01-01
        • 2022-12-01
        • 2021-05-12
        • 2021-08-25
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        相关资源
        最近更新 更多