我有一个包含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
,并计算ID
内outcome
的唯一值的数量。
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
的计数,我该如何实现?谢谢!
答案 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_index
和pd.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)
df['dummy_yes'] = df.outcome == 'yes'
df['dummy_no'] = df.outcome == 'no'
df.groupby('ID').sum()