有了一个数据集,我必须以多种方式对它进行分组(使用MultiIndex(,执行一些聚合并导出结果。其中一个操作是对具有价格的列进行装箱(装箱(,以获得每个桶中元素的数量。我需要3个桶,其中:
- 在第一个桶中,我获得价格等于该分组的最低价格或等于或不高于最低价格的110%的所有元素
- 在第二个桶中,我获得价格高于最低价格110%,但等于或不高于最低价格150%的所有元素
- 在第三个桶-其余的
示例:
产品 | 国家 | 销售col | 价格 | >colb | |
---|---|---|---|---|---|
第一个 | DE | A | b | 100 | x|
第二次 | DE | A | g | 105 | z|
第一个 | FR | A | b | 111 | x|
第二次 | FR | ||||
第一个 | DE | B | B109 | x||
第二次 | DE | B | g120 | z||
第一个 | FR | B | B<100>x|||
第二次 | FR |
- 只是按照您的描述
- 至垃圾箱切口
- 多索引和列groupby/agg和
unstack()
df = pd.DataFrame({'Product': ['First',
'Second',
'First',
'Second',
'First',
'Second',
'First',
'Second'],
'Country': ['DE', 'DE', 'FR', 'FR', 'DE', 'DE', 'FR', 'FR'],
'Sell': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'col': ['b', 'g', 'b', 'g', 'b', 'g', 'b', 'g'],
'price': [100, 105, 111, 100, 109, 120, 100, 200],
'colb': ['x', 'z', 'x', 'z', 'x', 'z', 'x', 'z'],
'bin': ['1x', '1x', '1.1x', '1x', '1x', '1.1x', '1x', '>1.5x']})
df["bin"] = pd.cut(
df["price"],
bins=[
df["price"].min() - 1,
df["price"].min() * 1.1,
df["price"].min() * 1.5,
df["price"].max(),
],
labels=["1x", "1.1x", ">1.5x"],
)
df.groupby(["Product","Country","Sell","bin"]).agg({"col":"count"}).unstack().droplevel(0,1)
输出
bin 1x 1.1x >1.5x
Product Country Sell
First DE A 1 0 0
B 1 0 0
FR A 0 1 0
B 1 0 0
Second DE A 1 0 0
B 0 1 0
FR A 1 0 0
B 0 0 1