[英]Pandas pivoted dataframe and multi-column Boolean comparison
我有一個數據透視表的形式
Price Units
Buyer B G S B G S
Idx
1 0 1.51 0 0 11 0
2 2.32 1.32 0 21 13 0
3 0 0 1.44 0 0 14
我正在嘗試使用可以被認為是(逐個單元)的邏輯,用B,G,S子列創建另一個名為“ Flag”的主列。
p['Flag'] = (p['Price'] < 2.0) & (p['Units'] > 13.5)
因此,期望的結果(僅顯示新列)
Flag
Buyer B G S
Idx
1 False False False
2 False False False
3 False False True
我嘗試了很多方法,以下方法比其他方法更接近
newp = p.join(((p['Price'] < 2.0) & (p['Units'] > 13.5)).rename(columns=dict(Price='Flag')))
但這有兩個問題
關於固定布爾條件並在正確級別合並的任何想法?
用於生成初始數據幀的代碼是
from collections import OrderedDict
import pandas as pd
table = OrderedDict((
("Idx", [1, 2, 2, 3]),
('Buyer',['G', 'B', 'G', 'S']),
('Price', ['1.51', '2.32', '1.32', '1.44']),
('Units', ['11', '21', '13', '14'])
))
d = pd.DataFrame(table)
p = d.pivot(index='Idx', columns='Buyer')
p.fillna(0, inplace=True)
我認為您需要將字符串數字轉換為按astype
float
,然后使用concat
:
p = p.astype(float)
newp = pd.concat([p['Price'], p['Units'], (p['Price'] < 2.0) & (p['Units'] > 13.5)],
axis=1,
keys=['Price','Units','Flag'])
print (newp)
Price Units Flag
Buyer B G S B G S B G S
Idx
1 0.00 1.51 0.00 0.0 11.0 0.0 False False False
2 2.32 1.32 0.00 21.0 13.0 0.0 False False False
3 0.00 0.00 1.44 0.0 0.0 14.0 False False True
使用join
和MultiIndex.from_product
創建新level
解決方案:
p = p.astype(float)
a = (p['Price'] < 2.0) & (p['Units'] > 13.5)
a.columns = pd.MultiIndex.from_product([['Flag'],a.columns])
p = p.join(a)
print (p)
Price Units Flag
Buyer B G S B G S B G S
Idx
1 0.00 1.51 0.00 0.0 11.0 0.0 False False False
2 2.32 1.32 0.00 21.0 13.0 0.0 False False False
3 0.00 0.00 1.44 0.0 0.0 14.0 False False True
在'Price'
上使用雙括號保存多索引,並在刪除多索引的第一級后與'Units'
進行邏輯組合。 這樣,剩下的水平自然就會與'Price'
多指標的第二水平結合
聊夠了。 觀察:
p[['Price']].lt(2) & p.Units.gt(13.5)
Price
Buyer B G S
Idx
1 False False False
2 False False False
3 False False True
現在剩下的就是重命名'Price'
並join
p.join(
(
p[['Price']].lt(2) & p.Units.gt(13.5)
).rename(columns=dict(Price='Flag'))
)
Price Units Flag
Buyer B G S B G S B G S
Idx
1 0.00 1.51 0.00 0.0 11.0 0.0 False False False
2 2.32 1.32 0.00 21.0 13.0 0.0 False False False
3 0.00 0.00 1.44 0.0 0.0 14.0 False False True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.