簡體   English   中英

熊貓數據透視表和多列布爾比較

[英]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')))

但這有兩個問題

  1. 布爾輸出在右下角不正確。 這應該是正確的,因為相應的單元格價格小於2.0,相應的單元格單元大於13.5。
  2. 它給出警告“ UserWarning:在不同級別之間合並會產生意想不到的結果(左側2級,右側1級)”。 我似乎無法將主要列名稱“ 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

使用joinMultiIndex.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM