Python 聚合-列之间的计算

Python 聚合-列之间的计算,python,pandas,Python,Pandas,考虑这个数据帧: np.random.seed(0) df_agg = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'C' : np.random.choice(2, 8)}) 我想计算以下按A分组的列: 元素数 C C C C 前三个元素使用聚合很简单: aggregati

考虑这个数据帧:

np.random.seed(0)
df_agg = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                              'foo', 'bar', 'foo', 'foo'],
                       'C' : np.random.choice(2, 8)})
我想计算以下按
A
分组的列:

  • 元素数
  • C
  • C
  • C
  • C
前三个元素使用聚合很简单:

aggregations = {
    'C': {
        'Number of elements': 'count',
        'Number of True':sum,
        'Percentage of True': 'mean'
    }
}
df_tab = df_agg.groupby('A').agg(aggregations)
print df_tab
他输出:

                     C                                  
    Number of elements Number of True Percentage of True
A                                                       
bar                  3              2           0.666667
foo                  5              4           0.800000
但是,我不知道如何在同一个聚合中,计算由其他列组合而成的列—False的数量和百分比

作为解决办法,我可以这样做:

df_tab = df_tab['C'] #flatten
df_tab['Number of False'] = df_tab['Number of elements'] - df_tab['Number of True']
df_tab['Percentage of False'] = 1 - df_tab['Percentage of True']
这将产生我想要的,但我想知道如何做到这一切一次

     Number of elements  Number of True  Percentage of True  Number of False  Percentage of False
A                                                                                                
bar                   3               2            0.666667                1             0.333333
foo                   5               4            0.800000                1             0.200000

您可以使用lambda函数:

In [43]: aggregations = {
    ...:     'C': {
    ...:         'Number of elements': 'count',
    ...:         'Number of True':sum,
    ...:         'Percentage of True': 'mean',
    ...:         'Number of False': lambda x: len(x) - np.count_nonzero(x),
    ...:         'Percentage of False': lambda x: 1 - x.mean()
    ...:     }
    ...: }
    ...:
    ...: df_agg.groupby('A').agg(aggregations)
    ...:
Out[43]:
                  C
    Number of False Percentage of False Number of True Number of elements Percentage of True
A
bar               1            0.333333              2                  3           0.666667
foo               1            0.200000              4                  5           0.800000

回答以下问题:

假设我需要更复杂的计算并参考其他专栏。 有没有一种方法可以引用lambda中的列 作用

假设我们有以下DF:

In [62]: %paste
df = pd.DataFrame(
{'A': {0: 'foo',
  1: 'bar',
  2: 'foo',
  3: 'bar',
  4: 'foo',
  5: 'bar',
  6: 'foo',
  7: 'foo'},
 'C': {0: 0, 1: 1, 2: 1, 3: 0, 4: 1, 5: 1, 6: 1, 7: 1},
 'X': {0: 0.56804456109393231,
  1: 0.92559663829266103,
  2: 0.071036058197886942,
  3: 0.087129299701540708,
  4: 0.020218397440325719,
  5: 0.832619845547938,
  6: 0.77815675094985048,
  7: 0.87001214824681916}})
## -- End pasted text --

In [63]: df
Out[63]:
     A  C         X
0  foo  0  0.568045
1  bar  1  0.925597
2  foo  1  0.071036
3  bar  0  0.087129
4  foo  1  0.020218
5  bar  1  0.832620
6  foo  1  0.778157
7  foo  1  0.870012
解决方案:

允许我们访问DF分组块中的所有列:

In [78]: %paste
def f(grp):
    return pd.DataFrame({
                'Number of elements':len(grp),
                'Number of True': grp['C'].sum(),
                'Percentage of True': grp['C'].mean(),
                'XXX': grp['C'].mean() / grp['X'].sum()},  # <--- here we access different columns...
                index=[grp.name])
## -- End pasted text --

In [79]: df.groupby('A', as_index=False).apply(f)
Out[79]:
       Number of True  Number of elements  Percentage of True       XXX
0 bar               2                   3            0.666667  0.361269
1 foo               4                   5            0.800000  0.346700
[78]中的
:%粘贴
def f(玻璃钢):
返回pd.DataFrame({
“元素数量”:len(grp),
“True的数目”:grp['C'].sum(),
“真实百分比”:grp['C'].mean(),

“XXX”:grp['C'].mean()/grp['X'].sum(),#我认为您的选择是:1)明确定义辅助列,如“false的数量”,2)创建辅助数据帧并将其附加到
df_选项卡
。我喜欢这个,好主意。在这种特殊情况下,它将起作用。但假设我需要更复杂的计算并参考其他专栏。有没有一种方法可以引用lambda函数中的列?@HonzaB,这会很棘手,因为AFAIK
.agg()
将分别应用于单个columns@HonzaB,你能举个例子说明你需要访问其他栏目吗?嗯,我也这么想。但我刚刚注意到,您的输出中的列
Percentage of False
Percentage of True
是相同的。此外,当我运行您的代码时,我得到0。你能看一下吗?@HonzaB,当然,错误的计算百分比是