【问题标题】:Simple calculations on specific rows in pandas DataFrame对 pandas DataFrame 中特定行的简单计算
【发布时间】:2020-06-18 04:11:44
【问题描述】:

假设我有以下数据:

from pandas import DataFrame

boxes = {'Students': ['Alice','Alice','Alice','Bob','Bob','Red','Red','Red','Red'],
         'Subjects': ['Math','History','Economics','Economics','Math','Sociology','Ethics','History','Economics'],
         'Grade': [100,75,85,95,100,85,75,78,82]
        }

df = DataFrame(boxes, columns= ['Students','Subjects','Grade'])

我想知道AliceRed 各自的平均成绩和上课次数:

所以我想要的输出是

          GPA      Count
Students        
Alice     86.67    3
Red       80.00    4

是否有任何内置的 pandas 函数可以执行这些操作?我意识到以下代码

g = df.groupby('Students')['Grade']
df1 = pd.concat([g.mean().round(2), g.count()], axis=1)
df1.columns = ['GPA', 'Count']

将为所有学生找到我想要的,但我希望能够为特定学生找到这些。

【问题讨论】:

    标签: python python-3.x pandas group-by pandas-groupby


    【解决方案1】:

    您可以在此处使用named aggregation

    df.groupby('Students').agg(GPA = ('Grade','mean'),
                               Count = ('Grade','count'))
    
                    GPA  Count
    Students
    Alice     86.666667      3
    Bob       97.500000      2
    Red       80.000000      4
    

    要仅获取 AliceRed 的值,请使用 boolean indexinggroupby 创建掩码

    mask = df.Students.str.contains(r'\bAlice\b|\bRed\b') 
    #or
    # mask = (df.Students =='Alice') | (df.Students=='Red')
    
    df[mask].groupby('Students').agg(GPA = ('Grade','mean'),
                               Count = ('Grade','count'))
    
                    GPA  Count
    Students
    Alice     86.666667      3
    Red       80.000000      4
    

    或者像@jezrael 建议的那样,您可以在这里使用pd.Series.isin

    mask = df.Students.isin(['Alice', 'Red'])
    df[mask].groupby('Students').agg(GPA = ('Grade','mean'),
                               Count = ('Grade','count'))
    
    • 创建布尔掩码的Timeit结果

      • isin 每个循环 111 µs ± 6.67 µs(平均值 ± 标准偏差,7 次运行,每次 10000 次循环)
      • .str.contains 146 µs ± 3.75 µs 每个循环(平均值 ± 标准偏差。7 次运行,每次 10000 次循环)
      • boolean mask chaining 每个循环 261 µs ± 8.22 µs(平均值 ± 标准偏差,7 次运行,每次 1000 个循环)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2021-04-02
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多