当前位置: 首页 > 知识库问答 >
问题:

如何使用np更改多个列值。哪里

鄢松
2023-03-14

假设您拥有以下df:

d = {'line amount#1': [0.21, 0.13, 0.1], 'line amount#2': [0.0, 0.05, .05], 'ExclBTW': [0.5, 0.18, .05]}
dftaxitems = pd.DataFrame(data=d)
dftaxitems


line amount#1   line amount#2   ExclBTW
0   0.21                0.00    0.50
1   0.13                0.05    0.18
2   0.10                0.05    0.05

现在,我想把行数的所有值都改为np。当它们不相加到BTW列时为nan,当它们相加时保留该值。

所以我想动态地做这件事,因为行的数量可能多达10行。

但是,使用以下代码获取以下错误:

#change line amount if not totalling into ExclBTW:
dfchecklineamount = dftaxitems.filter(like='line amount').astype(float)
dfchecklineamount['sum'] = dfchecklineamount[list(dfchecklineamount.columns)].sum(axis=1)
dfchecklineamount['check'] = np.where(dfchecklineamount['sum'].astype(float) == dfresult['ExclBTW'].astype(float),True, False)

dfchecklineamount['check'] = np.where(dfchecklineamount['sum'].astype(float) == dfresult['ExclBTW'].astype(float),True, False)
colstochange = dfchecklineamount.filter(regex ='line amount').columns
dfchecklineamount[colstochange] = np.where(dfchecklineamount['check'] == False, np.nan,dfchecklineamount[colstochange] )







 ValueError: operands could not be broadcast together with shapes (2,) () (2,4) 

请帮忙!

期望输出:

line amount#1   line amount#2   ExclBTW
0   np.nan             np.nan    0.50
1   0.13                0.05     0.18
2   np.nan             np.nan     0.05

共有3个答案

南门宇
2023-03-14
dftaxitems['line amount#1'] = np.where(dftaxitems['line amount#1'] + dftaxitems['line amount#1'] >= dftaxitems['ExclBTW'], dftaxitems['line amount#1'], np.nan)
dftaxitems['line amount#2'] = np.where(dftaxitems['line amount#1'] + dftaxitems['line amount#1'] >= dftaxitems['ExclBTW'], dftaxitems['line amount#2'], np.nan)

我用这个,但一定有更好的方法来解决它

山越
2023-03-14

编辑:添加更通用的解决方案,该解决方案可处理任意数量的类似lineamount列

c = dftaxitems.filter(like='line amount#').columns
m = dftaxitems[c].sum(1).eq(dftaxitems['ExclBTW'])
dftaxitems.loc[~m, c] = np.nan
dftaxitems

你能试着跟着吗?简单的解释是:我们可以使用布尔索引来填充NaN值。首先在m变量中获取掩码(如果2列的总和等于第3列,则检查条件),然后使用loc函数相应地设置NaN值。

m = (dftaxitems['line amount#1'] + dftaxitems['line amount#2']) == dftaxitems['ExclBTW']

dftaxitems.loc[~m, ['line amount#1', 'line amount#2']] = np.nan
dftaxitems

输出如下:

   line amount#1  line amount#2  ExclBTW
0            NaN            NaN     0.50
1           0.13           0.05     0.18
2            NaN            NaN     0.05
吴涵育
2023-03-14

我们可以使用DataFrame。使用sumoveraxis=1过滤,然后使用DataFrame将值设置为NaN。遮罩

lines = dftaxitems.filter(like="line")
m = lines.sum(axis=1).ne(dftaxitems["ExclBTW"])
dftaxitems[lines.columns] = lines.mask(m)
   line amount#1  line amount#2  ExclBTW
0            NaN            NaN     0.50
1           0.13           0.05     0.18
2            NaN            NaN     0.05

 类似资料:
  • 问题内容: 尝试更改列的数据类型并设置新的默认值时遇到以下错误: 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’VARCHAR(255)NOT NULL SET DEFAULT’{}’‘附近使用正确的语法 问题答案: 同样的第二种可能性(感谢juergen_d):

  • 在尝试更改列的数据类型并设置新的默认值时,我遇到以下错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解第1行“varchar(255)NOT NULL SET DEFAULT”{}“附近使用的正确语法

  • 我有一张像下面这样的桌子, ID姓名电子邮件性别 这个表中已经有了一些值。 现在,我用下面的查询来添加年龄。 alter table tblPerson add Age int 现在,我的行结构看起来像 ID姓名电子邮件性别年龄 现在,我有了年龄表。有任何查询可以将这些年龄添加到新创建的列中吗? 所有年龄都是根据ID排序的。因此,如果需要逻辑,则不需要。我只需要添加列数据。 谢谢

  • 问题内容: 这是我当前的SQL的样子: 这是我的数据库_users表的样子: 我收到此错误: 您的SQL语法有误;检查与您的MariaDB服务器版本相对应的手册,以在’rid_in附近使用正确的语法;-修改列的默认值 链接到此行: 如果我更改此设置,则忽略该值: 它工作正常,如何将输入绑定到查询? 我的预期输出是能够用来更改默认用户角色值并将具有旧用户值的所有行更新为新行: 为了能够更新每个用户的

  • 问题内容: 我创建了基于 HTML: JS: 如您所见,我尝试通过2种方式在3秒后更改为,但没有人为我工作。真的很奇怪 我错过了什么? 实际上,我尝试在从Ajax获得响应后更改值,但是假设应该是相同的问题。 谢谢, 这是我的示例:http : //jsfiddle.net/6uKAT/20/ 问题答案: 尝试使用: Angular的window.setTimeout包装。fn函数包装在try /

  • 我有一个包含日期列的表。 早些时候,我以“7 / 8 / 2012”格式插入了日期值。- m/d/yyyy 我想以“07/08/2014”的形式更改此格式。- 月/日/年 我的表中有大约3000个条目。如何将此日期值更改为新格式。我试图使用“alter”命令和set,但无法批量更改它。