gpt4 book ai didi

python - Pandas 旋转数据框和多列 bool 比较

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:00 24 4
gpt4 key购买 nike

我有一个表格的旋转数据框

      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

我正在尝试使用可以被认为是(逐个单元格)的逻辑创建另一个名为“Flag”的主要列,其中包含 B、G、S 子列

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. 右下角的 bool 输出不正确。这应该是正确的,因为相应的单元格价格小于 2.0,而相应的单元格单位大于 13.5。
  2. 它发出警告“UserWarning:不同级别之间的合并会产生意外结果(左侧 2 级,右侧 1 级)”。我似乎无法将主要列名称“Flag”放入数据框中。

关于修复 bool 条件和在正确级别合并的任何想法?

生成初始数据帧的代码是

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

关于python - Pandas 旋转数据框和多列 bool 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45024998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com