【发布时间】:2017-12-22 08:18:12
【问题描述】:
以下来自: Pandas - creating 2 new columns based on 2 columns and a separate test column
但这本身就是一个不同的问题。应该更简单!
在引用的问题中,讨论了以下单行代码,用于从其他 2 列中填充 2 个新列,并取决于第三列的值:
df['Buyer ID'], df['Seller ID'] = zip(
*np.where(df.buy_sell == 'Buy',
(df.buyer_name,df.seller_name),
(df.seller_name,df.buyer_name)).T)
这很好用 - 但是当我尝试简化它以使用固定标量值而不是其他列中的对应值时,它不起作用。
例如,如果我只有一个可能的买家 John 和一个可能的卖家 Maggie,那么以下更简单的构造就足够了:
df['Buyer ID'], df['Seller ID'] = zip(
*np.where(df.buy_sell == 'Buy',
("John","Maggie"),
("Maggie","John")).T)
内部 np.where() 调用失败:
operands could not be broadcast together with shapes
我尝试了一些变体,例如将元组包装在 zip() 中,这会改变形状,但我仍然得到错误。我认为问题在于 ("John","Maggie") 没有作为单列的内容返回。元组被扩展为意味着 >1 列?
这个链接也显示了一些承诺: Changing certain values in multiple columns of a pandas DataFrame at once
但我认为该解决方案假定您希望编辑的列已经存在,并且您只希望在每一列中放置相同的单个值。
我可以通过多次通过来解决这个问题,但这并不理想:
np.where(df.buy_sell == 'Buy', 'John', 'Maggie')
理想情况下,对于每一行,我想要一个可扩展至 N 个新列的单通道解决方案,这些新列填充有不同的固定默认值,但全部取决于另一列中的单个(布尔)值。
关于我缺少什么的任何指针?
【问题讨论】:
标签: python pandas dataframe array-broadcasting