gpt4 book ai didi

python - Pandas 中的聚合

转载 作者:太空狗 更新时间:2023-10-29 18:24:53 25 4
gpt4 key购买 nike

  • 如何使用 Pandas 执行聚合?
  • 聚合后没有 DataFrame!发生了什么?
  • 如何主要聚合字符串列(到 list s, tuple s, strings with separator )?
  • 如何汇总计数?
  • 如何创建由聚合值填充的新列?

  • 我已经看到这些反复出现的问题询问 Pandas 聚合功能的各个方面。
    今天关于聚合及其各种用例的大部分信息都分散在数十个措辞恶劣、无法搜索的帖子中。
    这里的目的是为后代整理一些更重要的观点。
    本问答是一系列有用的用户指南的下一部分:
  • How to pivot a dataframe ,
  • Pandas concat
  • How do I operate on a DataFrame with a Series for every column?
  • Pandas Merging 101

  • 请注意,这篇文章并不能替代 documentation about aggregation和关于 groupby ,所以也请阅读!

    最佳答案

    问题 1
    如何使用 Pandas 执行聚合?
    展开 aggregation documentation .
    聚合函数是减少返回对象维度的函数。这意味着输出 Series/DataFrame 与原始行有更少或相同的行。
    下表列出了一些常见的聚合函数:

    Function    Descriptionmean()         Compute mean of groupssum()         Compute sum of group valuessize()         Compute group sizescount()     Compute count of groupstd()         Standard deviation of groupsvar()         Compute variance of groupssem()         Standard error of the mean of groupsdescribe()     Generates descriptive statisticsfirst()     Compute first of group valueslast()         Compute last of group valuesnth()         Take nth value, or a subset if n is a listmin()         Compute min of group valuesmax()         Compute max of group values
    np.random.seed(123)

    df = pd.DataFrame({'A' : ['foo', 'foo', 'bar', 'foo', 'bar', 'foo'],
    'B' : ['one', 'two', 'three','two', 'two', 'one'],
    'C' : np.random.randint(5, size=6),
    'D' : np.random.randint(5, size=6),
    'E' : np.random.randint(5, size=6)})
    print (df)
    A B C D E
    0 foo one 2 3 0
    1 foo two 4 1 0
    2 bar three 2 1 1
    3 foo two 1 0 3
    4 bar two 3 1 4
    5 foo one 2 1 0
    按过滤列和 Cython implemented functions 聚合:
    df1 = df.groupby(['A', 'B'], as_index=False)['C'].sum()
    print (df1)
    A B C
    0 bar three 2
    1 bar two 3
    2 foo one 4
    3 foo two 5
    聚合函数用于所有列,但未在 groupby 中指定。函数,这里是 A, B列:
    df2 = df.groupby(['A', 'B'], as_index=False).sum()
    print (df2)
    A B C D E
    0 bar three 2 1 1
    1 bar two 3 1 4
    2 foo one 4 4 0
    3 foo two 5 1 3
    您还可以在 groupby 之后仅指定列表中用于聚合的某些列。功能:
    df3 = df.groupby(['A', 'B'], as_index=False)['C','D'].sum()
    print (df3)
    A B C D
    0 bar three 2 1
    1 bar two 3 1
    2 foo one 4 4
    3 foo two 5 1
    使用函数 DataFrameGroupBy.agg 的结果相同:
    df1 = df.groupby(['A', 'B'], as_index=False)['C'].agg('sum')
    print (df1)
    A B C
    0 bar three 2
    1 bar two 3
    2 foo one 4
    3 foo two 5

    df2 = df.groupby(['A', 'B'], as_index=False).agg('sum')
    print (df2)
    A B C D E
    0 bar three 2 1 1
    1 bar two 3 1 4
    2 foo one 4 4 0
    3 foo two 5 1 3
    对于应用于一列的多个函数,请使用 tuple 的列表s - 新列和聚合函数的名称:
    df4 = (df.groupby(['A', 'B'])['C']
    .agg([('average','mean'),('total','sum')])
    .reset_index())
    print (df4)
    A B average total
    0 bar three 2.0 2
    1 bar two 3.0 3
    2 foo one 2.0 4
    3 foo two 2.5 5
    如果想传递多个函数是可能的传递 listtuple s:
    df5 = (df.groupby(['A', 'B'])
    .agg([('average','mean'),('total','sum')]))

    print (df5)
    C D E
    average total average total average total
    A B
    bar three 2.0 2 1.0 1 1.0 1
    two 3.0 3 1.0 1 4.0 4
    foo one 2.0 4 2.0 4 0.0 0
    two 2.5 5 0.5 1 1.5 3
    然后得到 MultiIndex在列中:
    print (df5.columns)
    MultiIndex(levels=[['C', 'D', 'E'], ['average', 'total']],
    labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
    并用于转换为列,展平 MultiIndex使用 mapjoin :
    df5.columns = df5.columns.map('_'.join)
    df5 = df5.reset_index()
    print (df5)
    A B C_average C_total D_average D_total E_average E_total
    0 bar three 2.0 2 1.0 1 1.0 1
    1 bar two 3.0 3 1.0 1 4.0 4
    2 foo one 2.0 4 2.0 4 0.0 0
    3 foo two 2.5 5 0.5 1 1.5 3
    另一种解决方案是传递聚合函数列表,然后展平 MultiIndex对于其他列名称使用 str.replace :
    df5 = df.groupby(['A', 'B']).agg(['mean','sum'])

    df5.columns = (df5.columns.map('_'.join)
    .str.replace('sum','total')
    .str.replace('mean','average'))
    df5 = df5.reset_index()
    print (df5)
    A B C_average C_total D_average D_total E_average E_total
    0 bar three 2.0 2 1.0 1 1.0 1
    1 bar two 3.0 3 1.0 1 4.0 4
    2 foo one 2.0 4 2.0 4 0.0 0
    3 foo two 2.5 5 0.5 1 1.5 3
    如果想分别用聚合函数指定每一列,传递 dictionary :
    df6 = (df.groupby(['A', 'B'], as_index=False)
    .agg({'C':'sum','D':'mean'})
    .rename(columns={'C':'C_total', 'D':'D_average'}))
    print (df6)
    A B C_total D_average
    0 bar three 2 1.0
    1 bar two 3 1.0
    2 foo one 4 2.0
    3 foo two 5 0.5
    您也可以传递自定义函数:
    def func(x):
    return x.iat[0] + x.iat[-1]

    df7 = (df.groupby(['A', 'B'], as_index=False)
    .agg({'C':'sum','D': func})
    .rename(columns={'C':'C_total', 'D':'D_sum_first_and_last'}))
    print (df7)
    A B C_total D_sum_first_and_last
    0 bar three 2 2
    1 bar two 3 2
    2 foo one 4 4
    3 foo two 5 1
    问题2
    聚合后没有 DataFrame!发生了什么?
    按两列或多列聚合:
    df1 = df.groupby(['A', 'B'])['C'].sum()
    print (df1)
    A B
    bar three 2
    two 3
    foo one 4
    two 5
    Name: C, dtype: int32
    先查 Indextype Pandas 对象的:
    print (df1.index)
    MultiIndex(levels=[['bar', 'foo'], ['one', 'three', 'two']],
    labels=[[0, 0, 1, 1], [1, 2, 0, 2]],
    names=['A', 'B'])

    print (type(df1))
    <class 'pandas.core.series.Series'>
    获取方式有两种解决方案 MultiIndex Series列:
  • 添加参数 as_index=False
  • df1 = df.groupby(['A', 'B'], as_index=False)['C'].sum()
    print (df1)
    A B C
    0 bar three 2
    1 bar two 3
    2 foo one 4
    3 foo two 5
  • 使用 Series.reset_index :
  • df1 = df.groupby(['A', 'B'])['C'].sum().reset_index()
    print (df1)
    A B C
    0 bar three 2
    1 bar two 3
    2 foo one 4
    3 foo two 5

    如果按一列分组:
    df2 = df.groupby('A')['C'].sum()
    print (df2)
    A
    bar 5
    foo 9
    Name: C, dtype: int32
    ... 得到 SeriesIndex :
    print (df2.index)
    Index(['bar', 'foo'], dtype='object', name='A')

    print (type(df2))
    <class 'pandas.core.series.Series'>
    解决方案与 MultiIndex Series 中的解决方案相同:
    df2 = df.groupby('A', as_index=False)['C'].sum()
    print (df2)
    A C
    0 bar 5
    1 foo 9

    df2 = df.groupby('A')['C'].sum().reset_index()
    print (df2)
    A C
    0 bar 5
    1 foo 9
    问题 3
    如何主要聚合字符串列(到 list s, tuple s, strings with separator )?
    df = pd.DataFrame({'A' : ['a', 'c', 'b', 'b', 'a', 'c', 'b'],
    'B' : ['one', 'two', 'three','two', 'two', 'one', 'three'],
    'C' : ['three', 'one', 'two', 'two', 'three','two', 'one'],
    'D' : [1,2,3,2,3,1,2]})
    print (df)
    A B C D
    0 a one three 1
    1 c two one 2
    2 b three two 3
    3 b two two 2
    4 a two three 3
    5 c one two 1
    6 b three one 2
    可以通过 list 代替聚合函数, tuple , set用于转换列:
    df1 = df.groupby('A')['B'].agg(list).reset_index()
    print (df1)
    A B
    0 a [one, two]
    1 b [three, two, three]
    2 c [two, one]
    另一种方法是使用 GroupBy.apply :
    df1 = df.groupby('A')['B'].apply(list).reset_index()
    print (df1)
    A B
    0 a [one, two]
    1 b [three, two, three]
    2 c [two, one]
    要转换为带分隔符的字符串,请使用 .join仅当它是字符串列时:
    df2 = df.groupby('A')['B'].agg(','.join).reset_index()
    print (df2)
    A B
    0 a one,two
    1 b three,two,three
    2 c two,one
    如果是数字列,请使用带有 astype 的 lambda 函数用于转换为 string s:
    df3 = (df.groupby('A')['D']
    .agg(lambda x: ','.join(x.astype(str)))
    .reset_index())
    print (df3)
    A D
    0 a 1,3
    1 b 3,2,2
    2 c 2,1
    另一种解决方案是在 groupby 之前转换为字符串:
    df3 = (df.assign(D = df['D'].astype(str))
    .groupby('A')['D']
    .agg(','.join).reset_index())
    print (df3)
    A D
    0 a 1,3
    1 b 3,2,2
    2 c 2,1
    要转换所有列,请不要在 groupby 之后传递列列表.
    没有任何栏目 D , 因为 automatic exclusion of 'nuisance' columns .这意味着排除所有数字列。
    df4 = df.groupby('A').agg(','.join).reset_index()
    print (df4)
    A B C
    0 a one,two three,three
    1 b three,two,three two,two,one
    2 c two,one one,two
    所以需要把所有的列都转换成字符串,然后得到所有的列:
    df5 = (df.groupby('A')
    .agg(lambda x: ','.join(x.astype(str)))
    .reset_index())
    print (df5)
    A B C D
    0 a one,two three,three 1,3
    1 b three,two,three two,two,one 3,2,2
    2 c two,one one,two 2,1
    问题 4
    如何汇总计数?
    df = pd.DataFrame({'A' : ['a', 'c', 'b', 'b', 'a', 'c', 'b'],
    'B' : ['one', 'two', 'three','two', 'two', 'one', 'three'],
    'C' : ['three', np.nan, np.nan, 'two', 'three','two', 'one'],
    'D' : [np.nan,2,3,2,3,np.nan,2]})
    print (df)
    A B C D
    0 a one three NaN
    1 c two NaN 2.0
    2 b three NaN 3.0
    3 b two two 2.0
    4 a two three 3.0
    5 c one two NaN
    6 b three one 2.0
    功能 GroupBy.size size每组:
    df1 = df.groupby('A').size().reset_index(name='COUNT')
    print (df1)
    A COUNT
    0 a 2
    1 b 3
    2 c 2
    功能 GroupBy.count 排除缺失值:
    df2 = df.groupby('A')['C'].count().reset_index(name='COUNT')
    print (df2)
    A COUNT
    0 a 2
    1 b 2
    2 c 1
    此函数应用于多列以计算非缺失值:
    df3 = df.groupby('A').count().add_suffix('_COUNT').reset_index()
    print (df3)
    A B_COUNT C_COUNT D_COUNT
    0 a 2 2 1
    1 b 3 2 3
    2 c 2 1 1
    一个相关的函数是 Series.value_counts .它以降序返回包含唯一值计数的对象的大小,因此第一个元素是最常出现的元素。它不包括 NaN s 值默认。
    df4 = (df['A'].value_counts()
    .rename_axis('A')
    .reset_index(name='COUNT'))
    print (df4)
    A COUNT
    0 b 3
    1 a 2
    2 c 2
    如果您想要与使用函数 groupby 相同的输出+ size , 添加 Series.sort_index :
    df5 = (df['A'].value_counts()
    .sort_index()
    .rename_axis('A')
    .reset_index(name='COUNT'))
    print (df5)
    A COUNT
    0 a 2
    1 b 3
    2 c 2
    问题 5
    如何创建由聚合值填充的新列?
    方法 GroupBy.transform 返回与被分组的对象索引相同(相同大小)的对象。
    the Pandas documentation想要查询更多的信息。
    np.random.seed(123)

    df = pd.DataFrame({'A' : ['foo', 'foo', 'bar', 'foo', 'bar', 'foo'],
    'B' : ['one', 'two', 'three','two', 'two', 'one'],
    'C' : np.random.randint(5, size=6),
    'D' : np.random.randint(5, size=6)})
    print (df)
    A B C D
    0 foo one 2 3
    1 foo two 4 1
    2 bar three 2 1
    3 foo two 1 0
    4 bar two 3 1
    5 foo one 2 1


    df['C1'] = df.groupby('A')['C'].transform('sum')
    df['C2'] = df.groupby(['A','B'])['C'].transform('sum')


    df[['C3','D3']] = df.groupby('A')['C','D'].transform('sum')
    df[['C4','D4']] = df.groupby(['A','B'])['C','D'].transform('sum')

    print (df)

    A B C D C1 C2 C3 D3 C4 D4
    0 foo one 2 3 9 4 9 5 4 4
    1 foo two 4 1 9 5 9 5 5 1
    2 bar three 2 1 5 2 5 2 2 1
    3 foo two 1 0 9 5 9 5 5 1
    4 bar two 3 1 5 3 5 2 3 1
    5 foo one 2 1 9 4 9 5 4 4

    关于python - Pandas 中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53781634/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com