Groupby并计算唯一值的数量(Pandas)

时间:2017-08-03 21:55:24

标签: python pandas dataframe count unique

我有一个包含2个变量的数据框:import { Component, OnInit, OnDestroy, OnChanges, Input, SimpleChanges } from '@angular/core'; import { Feature, layer, Coordinate, geom } from 'openlayers'; @Component({ selector: 'app-vector-layer-feature', templateUrl: './vector-layer-feature.component.html', styleUrls: ['./vector-layer-feature.component.css'] }) export class VectorLayerFeatureComponent implements OnInit { public instance: Feature; @Input() id: string|number|undefined; @Input() layer : layer.Vector; @Input() coordinate : Coordinate; @Input() properties : any; constructor() { } ngOnInit() { this.instance = new Feature(); if (this.id !== undefined) { this.instance.setId(this.id); } if(this.properties){ //console.log(this.properties, 'props') this.instance.setProperties(this.properties); } this.instance.setGeometry( new geom.Point(this.coordinate) ); this.layer.getSource().addFeature(this.instance); } ngAfterViewInit(){ } ngOnDestroy() { console.log('FeatureDestroy') this.layer.getSource().removeFeature(this.instance); this.layer.changed(); } ngOnChanges(changes: SimpleChanges) { //console.log(changes) if (this.instance) { this.instance.setId(this.id); this.instance.setGeometry( new geom.Point(this.coordinate) ); this.instance.setProperties(this.properties) } } } ID。我首先尝试outcome groupby,并计算IDoutcome的唯一值的数量。

ID

预期产出:

df
ID    outcome
1      yes
1      yes
1      yes
2      no
2      yes
2      no

我的代码ID yes no 1 3 0 2 1 2 给出了唯一值本身的编号,例如:

df[['PID', 'outcome']].groupby('PID')['outcome'].nunique()

但我需要ID 1 2 2 2 yes的计数,我该如何实现?谢谢!

5 个答案:

答案 0 :(得分:5)

pd.crosstab怎么样?

In [1217]: pd.crosstab(df.ID, df.outcome)
Out[1217]: 
outcome  no  yes
ID              
1         0    3
2         2    1

答案 1 :(得分:4)

选项2
pd.factorize + np.bincount
这是令人费解和痛苦的......但速度非常快。

fi, ui = pd.factorize(df.ID.values)
fo, uo = pd.factorize(df.outcome.values)

n, m = ui.size, uo.size
pd.DataFrame(
    np.bincount(fi * m + fo, minlength=n * m).reshape(n, m),
    pd.Index(ui, name='ID'), pd.Index(uo, name='outcome')
)

outcome  yes  no
ID              
1          3   0
2          1   2

选项C

pd.get_dummies(d.ID).T.dot(pd.get_dummies(d.outcome))

   no  yes
1   0    3
2   2    1

选项IV

df.groupby(['ID', 'outcome']).size().unstack(fill_value=0)

答案 2 :(得分:2)

ID列上进行分组,然后使用value_counts列上的outcome进行汇总。这将产生一系列,因此您需要使用.to_frame()将其转换回数据框,以便您可以取消堆叠是/否(即将它们作为列)。然后用零填充空值。

df_total = df.groupby('ID')['outcome'].value_counts().to_frame().unstack(fill_value=0)
df_total.columns = df_total.columns.droplevel()
>>> df_total
outcome  no  yes
ID              
1         0    3
2         2    1

答案 3 :(得分:0)

使用set_indexpd.concat

df1 = df.set_index('ID')
pd.concat([df1.outcome.eq('yes').sum(level=0),
          df1.outcome.ne('yes').sum(level=0)], keys=['yes','no'],axis=1).reset_index()

输出:

   ID  yes   no
0   1  3.0  0.0
1   2  1.0  2.0

答案 4 :(得分:0)

最有效的设置,可以防止任何过去,现在和将来的错误并利用FAST向量化功能来做(非常简单)以下事情:

df['dummy_yes'] = df.outcome == 'yes'
df['dummy_no'] = df.outcome == 'no'

df.groupby('ID').sum()